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)


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow