Haskell:
Lavorare con JSON

Come fare:

Haskell non ha un supporto integrato per JSON come JavaScript, ma con l’aiuto di librerie di terze parti come Aeson, la gestione del JSON diventa semplice. Aeson fornisce funzioni sia ad alto livello che a basso livello per la codifica (conversione dei valori Haskell in JSON) e la decodifica (analisi del JSON in valori Haskell).

Installare Aeson

Prima di tutto, aggiungi Aeson alle dipendenze del tuo progetto aggiornando il tuo file .cabal o utilizzando direttamente Stack o Cabal:

cabal update && cabal install aeson

oppure, se stai utilizzando Stack:

stack install aeson

Analisi di JSON

Iniziamo con un esempio di base di decodifica di dati JSON in un tipo Haskell. Supponiamo di avere il seguente JSON che rappresenta una persona:

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

Prima, definisci un corrispondente tipo di dato Haskell e rendilo un’istanza di 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

-- Funzione per decodificare JSON da un file
decodePerson :: FilePath -> IO (Maybe Person)
decodePerson filePath = do
  personJson <- B.readFile filePath
  return $ decode personJson

Utilizzo: Assumendo che person.json contenga i dati JSON mostrati sopra, esegui:

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

Output di esempio:

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

Codifica di Valori Haskell come JSON

Per convertire un valore Haskell di nuovo in JSON, è necessario rendere il tuo tipo un’istanza di ToJSON e quindi utilizzare encode.

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

-- Assumendo il tipo Person di prima

instance ToJSON Person

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

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

Output di esempio:

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

Questi esempi dimostrano le basi del lavoro con JSON in Haskell usando Aeson. Ricorda, Aeson offre molto di più, incluse regole di parsing personalizzate, lavoro con JSON annidati complessi e molto altro, adatto a varie esigenze e scenari.