toJson实例单个值

时间:2018-11-30 15:10:50

标签: haskell aeson

我能够对数据进行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]

对于仅具有一个“标量”值的数据(例如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(我该怎么做)?预先感谢您的帮助

1 个答案:

答案 0 :(得分:2)

由于toJSON必须返回类型为Value的值,因此您不能单独返回text。它必须用String数据构造函数包装。

toJSON (ReadServiceResponse text) = String text

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

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

或在toJSON中进行转换:

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