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)


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow