Haskell:
Trabajando con JSON

Cómo:

Haskell no tiene soporte incorporado para JSON como JavaScript, pero con la ayuda de bibliotecas de terceros como Aeson, manejar JSON se vuelve sencillo. Aeson proporciona funciones de alto y bajo nivel tanto para la codificación (convertir valores de Haskell a JSON) como para la decodificación (analizar JSON en valores de Haskell).

Instalando Aeson

Primero, añade Aeson a las dependencias de tu proyecto actualizando tu archivo .cabal o usando Stack o Cabal directamente:

cabal update && cabal install aeson

o, si estás usando Stack:

stack install aeson

Analizando JSON

Empecemos con un ejemplo básico de decodificación de datos JSON en un tipo de Haskell. Supongamos que tenemos el siguiente JSON que representa a una persona:

{
  "name": "John Doe",
  "age": 30
}

Primero, define un tipo de datos Haskell correspondiente y hazlo una instancia de FromJSON:

{-# LANGUAGE DeriveGeneric #-}

import GHC.Generics (Generic)
import Data.Aeson (FromJSON, decode)
import qualified Data.ByteString.Lazy as B

data Person = Person
  { name :: String
  , age :: Int
  } derivando (Generic, Show)

instance FromJSON Person

-- Función para decodificar JSON de un archivo
decodePerson :: FilePath -> IO (Maybe Person)
decodePerson filePath = do
  personJson <- B.readFile filePath
  return $ decode personJson

Uso: Asumiendo que person.json contiene los datos JSON mostrados arriba, ejecutar:

main :: IO ()
main = do
  maybePerson <- decodePerson "person.json"
  print maybePerson

Salida de muestra:

Just (Person {name = "John Doe", age = 30})

Codificando Valores Haskell como JSON

Para convertir un valor Haskell de vuelta a JSON, necesitas hacer tu tipo una instancia de ToJSON y luego usar encode.

import Data.Aeson (ToJSON, encode)
import GHC.Generics (Generic)

-- Asumiendo el tipo Person de antes

instance ToJSON Person

encodePerson :: Person -> B.ByteString
encodePerson = encode

main :: IO ()
main = do
  let person = Person "Jane Doe" 32
  putStrLn $ show $ encodePerson person

Salida de muestra:

{"name":"Jane Doe","age":32}

Estos ejemplos demuestran los conceptos básicos de trabajar con JSON en Haskell usando Aeson. Recuerda, Aeson ofrece mucho más, incluyendo reglas de análisis personalizadas, trabajar con JSON anidado complejo, y mucho más, adecuado para diversas necesidades y escenarios.