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)


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow