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