Haskell:
Arbeider med JSON
Hvordan:
Haskell har ikke innebygd støtte for JSON som JavaScript, men med hjelp fra tredjepartsbiblioteker som Aeson, blir håndtering av JSON enkelt. Aeson tilbyr både høy- og lavnivåfunksjoner for koding (konvertere Haskell-verdier til JSON) og dekoding (parse JSON til Haskell-verdier).
Installere Aeson
Først, legg til Aeson i prosjektets avhengigheter ved å oppdatere din .cabal
-fil eller bruke Stack eller Cabal direkte:
cabal update && cabal install aeson
eller, hvis du bruker Stack:
stack install aeson
Parse JSON
La oss starte med et grunnleggende eksempel på dekoding av JSON-data til en Haskell-type. Anta at vi har følgende JSON som representerer en person:
{
"name": "John Doe",
"age": 30
}
Først, definer en tilsvarende Haskell-datatype og gjør den til en instans av 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
-- Funksjon for å dekode JSON fra en fil
decodePerson :: FilePath -> IO (Maybe Person)
decodePerson filePath = do
personJson <- B.readFile filePath
return $ decode personJson
Bruk:
Antar at person.json
inneholder JSON-dataene som vist ovenfor, kjør:
main :: IO ()
main = do
maybePerson <- decodePerson "person.json"
print maybePerson
Eksempel på utdata:
Just (Person {name = "John Doe", age = 30})
Enkoding av Haskell-verdier som JSON
For å konvertere en Haskell-verdi tilbake til JSON, må du gjøre typen din til en instans av ToJSON
og deretter bruke encode
.
import Data.Aeson (ToJSON, encode)
import GHC.Generics (Generic)
-- Antatt Person-typen fra før
instance ToJSON Person
encodePerson :: Person -> B.ByteString
encodePerson = encode
main :: IO ()
main = do
let person = Person "Jane Doe" 32
putStrLn $ show $ encodePerson person
Eksempel på utdata:
{"name":"Jane Doe","age":32}
Disse eksemplene demonstrerer det grunnleggende i å jobbe med JSON i Haskell ved hjelp av Aeson. Husk, Aeson tilbyr mye mer, inkludert egendefinerte parse-regler, arbeid med komplekse nøstede JSON og mye mer, egnet for ulike behov og scenarioer.