Haskell Language
Data.Aeson - JSON in Haskell
Suche…
Intelligente Kodierung und Dekodierung mit Generics
Die einfachste und schnellste Möglichkeit, einen Haskell-Datentyp in JSON mit Aeson zu codieren, ist die Verwendung von Generics.
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics
import Data.Text
import Data.Aeson
import Data.ByteString.Lazy
Zuerst erstellen wir einen Datentyp Person:
data Person = Person { firstName :: Text
, lastName :: Text
, age :: Int
} deriving (Show, Generic)
Um die encode
und decode
aus dem Data.Aeson
Paket verwenden zu können, müssen Sie Person
als Instanz von ToJSON
und FromJSON
. Da wir Generic
for Person
ableiten, können wir für diese Klassen leere Instanzen erstellen. Die Standarddefinitionen der Methoden werden anhand der von der Generic
Typklasse bereitgestellten Methoden definiert.
instance ToJSON Person
instance FromJSON Person
Erledigt! Um die Codierungsgeschwindigkeit zu verbessern, können wir die ToJSON
Instanz leicht ändern:
instance ToJSON Person where
toEncoding = genericToEncoding defaultOptions
Jetzt können wir die encode
Funktion verwenden, um Person
in einen (faulen) Bytestring umzuwandeln:
encodeNewPerson :: Text -> Text -> Int -> ByteString
encodeNewPerson first last age = encode $ Person first last age
Und zum Decodieren können wir einfach decode
:
> encodeNewPerson "Hans" "Wurst" 30
"{\"lastName\":\"Wurst\",\"age\":30,\"firstName\":\"Hans\"}"
> decode $ encodeNewPerson "Hans" "Wurst" 30
Just (Person {firstName = "Hans", lastName = "Wurst", age = 30})
Eine schnelle Methode zum Generieren eines 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
Optionale Felder
Manchmal möchten wir, dass einige Felder in der JSON-Zeichenfolge optional sind. Zum Beispiel,
data Person = Person { firstName :: Text
, lastName :: Text
, age :: Maybe Int
}
Dies kann durch erreicht werden
import Data.Aeson.TH
$(deriveJSON defaultOptions{omitNothingFields = True} ''Person)