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
我能够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