toJson实例单值

toJson instance single value

我能够json-编码我的数据

import Data.Aeson                       (ToJSON, toJSON, (.=), object)
import qualified Data.Text      as T
import qualified Data.Text.Lazy as L

data ServiceResponse = ReadServiceResponse  L.Text
                     | GenericServiceError  Int L.Text

instance ToJSON ServiceResponse where
    toJSON (ReadServiceResponse text)      = object ["text" .= text]
    toJSON (GenericServiceError code text) =
        object ["code" .= code, "message" .= text]

对于只有一个 "scalar" 值的数据(例如 String、Int、L.Text、...),我想获得标量表示而不是对象。例如 ReadServiceResponse 应该编码成 json 字符串而不是像

这样的对象
{
    text: "hi I'm some text."
}

我试过了

instance ToJSON ServiceResponse where
    toJSON (ReadServiceResponse text) = text

不编译

• Couldn't match expected type ‘aeson-1.3.1.1:Data.Aeson.Types.Internal.Value’ with actual type ‘L.Text’

我是否应该将 text 转换为 Data.Aeson.Types.Internal.Value(我该怎么做)?在此先感谢您的帮助

因为 toJSON 必须 return 一个 Value 类型的值,你不能 return text 本身;它必须用 String 数据构造函数包装。

toJSON (ReadServiceResponse text) = String text

请注意,自 String :: T.Text -> Value 以来,这需要您在 ReadServiceResopnse 的定义中使用 Text 的严格实现:

data ServiceResponse = ReadServiceResponse  T.Text -- not L.Text
                     | GenericServiceError  Int L.Text

或在 toJSON 中进行转换:

toJSON (ReadServiceResponse text) = String . T.pack . L.unpack $ text