Jiv*_*van 0 haskell algebraic-data-types aeson to-json
我有以下 ADT 实现:
data FeatureValue =
FvInt Int
| FvFloat Float
| FvText Text
| FvBool Bool
deriving Show
data ApiResponse =
Online [[Maybe FeatureValue]]
| Offline [[[Maybe FeatureValue]]]
deriving Show
Run Code Online (Sandbox Code Playgroud)
要编码的示例值可能是:
example :: ApiResponse
example =
Online [
[Just (FvInt 10), Nothing, Just (FvText "foo"), Just (FvFloat 1.42)],
[Nothing, Just (FvBool False), Just (FvText "bar"), Nothing]
]
Run Code Online (Sandbox Code Playgroud)
这将导致以下 JSON:
[
[10, null, "foo", 1.42],
[null, false, "bar", null]
]
Run Code Online (Sandbox Code Playgroud)
我正在努力研究如何特别地派生ToJSON实例FeatureValue。使用 Aeson 进行 ADT 编码的文档特别稀少(例如,其他很棒的 Aelve 指南,其中包含有关 ADT 编码/解码部分的精彩“摘要:待办事项”)。
从文档中,我们只需要提供一个类型的函数FeatureValue -> Value。的定义Value也被记录并完全导出。所以跟着你的鼻子走。
instance ToJSON FeatureValue where
toJSON (FvInt n) = Number (fromIntegral n)
toJSON (FvFloat f) = Number (realToFrac f)
toJSON (FvText t) = String t
toJSON (FvBool b) = Bool b
Run Code Online (Sandbox Code Playgroud)