Haskell Language
Data.Aeson - JSON in Haskell
Zoeken…
Smart Encoding en Decoding met behulp van Generics
De eenvoudigste en snelste manier om een Haskell-gegevenstype naar JSON te coderen met Aeson is het gebruik van generieke geneesmiddelen.
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics
import Data.Text
import Data.Aeson
import Data.ByteString.Lazy
Laten we eerst een gegevenstype Persoon maken:
data Person = Person { firstName :: Text
, lastName :: Text
, age :: Int
} deriving (Show, Generic)
Om het gebruik van encode
en decode
functie uit het Data.Aeson
pakket moeten we ervoor Person
een instantie van ToJSON
en FromJSON
. Omdat we Generic
for Person
afleiden, kunnen we lege instanties voor deze klassen maken. De standaarddefinities van de methoden worden gedefinieerd in termen van de methoden die door de klasse Generic
worden geleverd.
instance ToJSON Person
instance FromJSON Person
Gedaan! Om de coderingssnelheid te verbeteren, kunnen we de ToJSON
instantie enigszins wijzigen:
instance ToJSON Person where
toEncoding = genericToEncoding defaultOptions
Nu kunnen we de encode
gebruiken om Person
om te zetten in een (luie) Bytestring:
encodeNewPerson :: Text -> Text -> Int -> ByteString
encodeNewPerson first last age = encode $ Person first last age
En om te decoderen kunnen we gewoon decode
:
> encodeNewPerson "Hans" "Wurst" 30
"{\"lastName\":\"Wurst\",\"age\":30,\"firstName\":\"Hans\"}"
> decode $ encodeNewPerson "Hans" "Wurst" 30
Just (Person {firstName = "Hans", lastName = "Wurst", age = 30})
Een snelle manier om een Data.Aeson.Value te genereren
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.Aeson
main :: IO ()
main = do
let example = Data.Aeson.object [ "key" .= (5 :: Integer), "somethingElse" .= (2 :: Integer) ] :: Value
print . encode $ example
Optionele velden
Soms willen we dat sommige velden in de JSON-tekenreeks optioneel zijn. Bijvoorbeeld,
data Person = Person { firstName :: Text
, lastName :: Text
, age :: Maybe Int
}
Dit kan worden bereikt door
import Data.Aeson.TH
$(deriveJSON defaultOptions{omitNothingFields = True} ''Person)