Haskell Language
Data.Aeson - JSON w Haskell
Szukaj…
Inteligentne kodowanie i dekodowanie za pomocą Generics
Najłatwiejszym i najszybszym sposobem kodowania typu danych Haskell do JSON za pomocą Aeson jest użycie ogólnych.
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics
import Data.Text
import Data.Aeson
import Data.ByteString.Lazy
Najpierw utwórzmy typ danych Osoba:
data Person = Person { firstName :: Text
, lastName :: Text
, age :: Int
} deriving (Show, Generic)
Aby użyć funkcji encode
i decode
z pakietu Data.Aeson
, musimy uczynić Person
instancją ToJSON
i FromJSON
. Ponieważ otrzymujemy Generic
for Person
, możemy tworzyć puste instancje dla tych klas. Domyślne definicje metod są zdefiniowane w kategoriach metod dostarczonych przez klasę typów Generic
.
instance ToJSON Person
instance FromJSON Person
Gotowy! Aby poprawić szybkość kodowania, możemy nieznacznie zmienić instancję ToJSON
:
instance ToJSON Person where
toEncoding = genericToEncoding defaultOptions
Teraz możemy użyć funkcji encode
aby przekonwertować Person
na (leniwy) Bajtowanie:
encodeNewPerson :: Text -> Text -> Int -> ByteString
encodeNewPerson first last age = encode $ Person first last age
I do dekodowania możemy po prostu użyć decode
:
> encodeNewPerson "Hans" "Wurst" 30
"{\"lastName\":\"Wurst\",\"age\":30,\"firstName\":\"Hans\"}"
> decode $ encodeNewPerson "Hans" "Wurst" 30
Just (Person {firstName = "Hans", lastName = "Wurst", age = 30})
Szybki sposób na wygenerowanie 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
Pola opcjonalne
Czasami chcemy, aby niektóre pola w ciągu JSON były opcjonalne. Na przykład,
data Person = Person { firstName :: Text
, lastName :: Text
, age :: Maybe Int
}
Można to osiągnąć przez
import Data.Aeson.TH
$(deriveJSON defaultOptions{omitNothingFields = True} ''Person)