Haskell Language
Data.Aeson - JSON in Haskell
サーチ…
Genericsを使用したスマートエンコーディングとデコード
Aesonを使用してHaskellデータ型をJSONにエンコードする最も簡単で素早い方法は、ジェネリックを使用することです。
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics
import Data.Text
import Data.Aeson
import Data.ByteString.Lazy
まず、データ型Personを作成しましょう。
data Person = Person { firstName :: Text
, lastName :: Text
, age :: Int
} deriving (Show, Generic)
Data.Aesonパッケージのencodeとdecode機能を使用するには、 ToJSONとFromJSONインスタンスをPersonする必要があります。 Generic for Personを派生しているので、これらのクラスの空のインスタンスを作成できます。メソッドのデフォルト定義は、 Generic型クラスによって提供されるメソッドの観点から定義されます。
instance ToJSON Person
instance FromJSON Person
完了!エンコード速度を向上させるために、 ToJSONインスタンスを少し変更することができます。
instance ToJSON Person where
toEncoding = genericToEncoding defaultOptions
今度はEncode関数を使ってPersonを(怠惰な)Bytestringに変換encodeことができます:
encodeNewPerson :: Text -> Text -> Int -> ByteString
encodeNewPerson first last age = encode $ Person first last age
そして、私たちは使用することができますデコードするdecode :
> encodeNewPerson "Hans" "Wurst" 30
"{\"lastName\":\"Wurst\",\"age\":30,\"firstName\":\"Hans\"}"
> decode $ encodeNewPerson "Hans" "Wurst" 30
Just (Person {firstName = "Hans", lastName = "Wurst", age = 30})
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
オプションのフィールド
場合によっては、JSON文字列内のいくつかのフィールドをオプションにしたいと思うことがあります。例えば、
data Person = Person { firstName :: Text
, lastName :: Text
, age :: Maybe Int
}
これは
import Data.Aeson.TH
$(deriveJSON defaultOptions{omitNothingFields = True} ''Person)
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow