我能够对数据进行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
(我该怎么做)?预先感谢您的帮助
答案 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