Haskell:
Arbeta med JSON
Hur:
Haskell har inte inbyggt stöd för JSON som JavaScript, men med hjälp av tredjepartsbibliotek såsom Aeson, blir hanteringen av JSON enkel. Aeson erbjuder både hög-nivå och låg-nivå funktioner för kodning (konvertering av Haskell-värden till JSON) och avkodning (tolkning av JSON till Haskell-värden).
Installation av Aeson
Först, lägg till Aeson i ditt projekts beroenden genom att uppdatera din .cabal
-fil eller använd Stack eller Cabal direkt:
cabal update && cabal install aeson
eller, om du använder Stack:
stack install aeson
Tolka JSON
Låt oss börja med ett grundläggande exempel på avkodning av JSON-data till en Haskell-typ. Antag att vi har följande JSON som representerar en person:
{
"name": "John Doe",
"age": 30
}
Först, definiera en motsvarande Haskell-datayp och gör den till 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
-- Funktion för att avkoda JSON från en fil
decodePerson :: FilePath -> IO (Maybe Person)
decodePerson filePath = do
personJson <- B.readFile filePath
return $ decode personJson
Användning:
Förutsatt att person.json
innehåller JSON-datan som visas ovan, kör:
main :: IO ()
main = do
maybePerson <- decodePerson "person.json"
print maybePerson
Exempelutdata:
Just (Person {name = "John Doe", age = 30})
Kodning av Haskell-värden som JSON
För att konvertera ett Haskell-värde tillbaka till JSON behöver du göra din typ till en instans av ToJSON
och sedan använda encode
.
import Data.Aeson (ToJSON, encode)
import GHC.Generics (Generic)
-- Förutsatt att person-typen från tidigare
instance ToJSON Person
encodePerson :: Person -> B.ByteString
encodePerson = encode
main :: IO ()
main = do
let person = Person "Jane Doe" 32
putStrLn $ show $ encodePerson person
Exempelutdata:
{"name":"Jane Doe","age":32}
Dessa exempel demonstrerar grunderna i att arbeta med JSON i Haskell med hjälp av Aeson. Kom ihåg, Aeson erbjuder mycket mer, inklusive anpassade tolkningsregler, arbete med komplexa inbäddade JSON och mycket mer, lämpligt för olika behov och scenarier.