Haskell:
Trabalhando com JSON

Como:

Haskell não possui suporte embutido para JSON como JavaScript, mas com a ajuda de bibliotecas de terceiros como Aeson, manipular JSON se torna simples. Aeson oferece funções de alto e baixo nível para codificação (convertendo valores Haskell para JSON) e decodificação (analisando JSON para valores Haskell).

Instalando Aeson

Primeiro, adicione Aeson às dependências do seu projeto atualizando seu arquivo .cabal ou usando Stack ou Cabal diretamente:

cabal update && cabal install aeson

ou, se você estiver usando Stack:

stack install aeson

Analisando JSON

Vamos começar com um exemplo básico de decodificação de dados JSON em um tipo Haskell. Suponha que temos o seguinte JSON representando uma pessoa:

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

Primeiro, defina um tipo de dados Haskell correspondente e faça dele uma instância 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
  } deriving (Generic, Show)

instance FromJSON Person

-- Função para decodificar JSON de um arquivo
decodePerson :: FilePath -> IO (Maybe Person)
decodePerson filePath = do
  personJson <- B.readFile filePath
  return $ decode personJson

Uso: Assumindo que person.json contém os dados JSON mostrados acima, execute:

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

Saída de Amostra:

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

Codificando Valores Haskell como JSON

Para converter um valor Haskell de volta para JSON, você precisa fazer seu tipo uma instância de ToJSON e depois usar encode.

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

-- Supondo o 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

Saída de Amostra:

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

Estes exemplos demonstram o básico de trabalhar com JSON em Haskell usando Aeson. Lembre-se, Aeson oferece muito mais, incluindo regras de análise personalizadas, trabalho com JSON aninhado complexo, e muito mais, adequado para várias necessidades e cenários.