使用泛型的智能编码和解码

使用 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 包中的 encodedecode 函数,我们需要使 Person 成为 ToJSONFromJSON 的一个实例。由于我们为 Person 派生 Generic,我们可以为这些类创建空实例。方法的默认定义是根据 Generic 类型类提供的方法定义的。

instance ToJSON Person
instance FromJSON Person

完成! 为了提高编码速度,我们可以稍微改变 ToJSON 实例:

instance ToJSON Person where
    toEncoding = genericToEncoding defaultOptions

现在我们可以使用 encode 函数将 Person 转换为(懒惰)Bytestring:

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})