Haskell Language
Data.Aeson - JSON i Haskell
Sök…
Smart kodning och avkodning med Generics
Det enklaste och snabbaste sättet att koda en Haskell-datatyp till JSON med Aeson är att använda generika.
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics
import Data.Text
import Data.Aeson
import Data.ByteString.Lazy
Låt oss först skapa en datatyp Person:
data Person = Person { firstName :: Text
, lastName :: Text
, age :: Int
} deriving (Show, Generic)
För att kunna använda encode
och decode
från Data.Aeson
paketet måste vi göra Person
en instans av ToJSON
och FromJSON
. Eftersom vi hämtar Generic
for Person
kan vi skapa tomma instanser för dessa klasser. Standarddefinitionerna för metoderna definieras i termer av de metoder som tillhandahålls av klassen Generic
typ.
instance ToJSON Person
instance FromJSON Person
Gjort! För att förbättra kodningshastigheten kan vi ändra ToJSON
instansen något:
instance ToJSON Person where
toEncoding = genericToEncoding defaultOptions
Nu kan vi använda encode
att konvertera Person
till en (lat) Bytestring:
encodeNewPerson :: Text -> Text -> Int -> ByteString
encodeNewPerson first last age = encode $ Person first last age
Och för att avkoda kan vi bara använda decode
:
> encodeNewPerson "Hans" "Wurst" 30
"{\"lastName\":\"Wurst\",\"age\":30,\"firstName\":\"Hans\"}"
> decode $ encodeNewPerson "Hans" "Wurst" 30
Just (Person {firstName = "Hans", lastName = "Wurst", age = 30})
Ett snabbt sätt att generera en Data.Aeson.Value
{-# 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
Valfria fält
Ibland vill vi att vissa fält i JSON-strängen ska vara valfria. Till exempel,
data Person = Person { firstName :: Text
, lastName :: Text
, age :: Maybe Int
}
Detta kan uppnås genom
import Data.Aeson.TH
$(deriveJSON defaultOptions{omitNothingFields = True} ''Person)