使用泛型的智慧編碼和解碼

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