Aeson的deriveJSON对枚举不起作用

时间:2013-08-08 02:35:27

标签: haskell aeson

我通常会编写自己的ToJSONFromJSON个实例,但我决定使用deriveJSON作为类型,因为它非常简单:

data Priority = HIGH | MEDIUM | LOW deriving Show
$(deriveToJSON id ''Priority)

main = BS.putStrLn . encode $ HIGH

我希望JSON派生只是将枚举写成字符串。相反,它是哈希的关键! {"HIGH":[]}

为什么这是默认行为?

1 个答案:

答案 0 :(得分:4)

这是因为aeson不区分您Priority之类的和类型以及data PriorityAndDetails = HIGH { highReason :: Text, alertType :: Alert } | MEDIUM { personResponsible :: Person } | LOW等更复杂的类型。从根本上说,这些类型中的每一个都只是“只是一个带有 n 参数的数据构造函数”。

Priority HIGH中,MEDLOW都只是零参数的数据构造函数。在PriorityAndDetails HIGH中,MEDLOW都是数据构造函数,其中包含一定数量的命名参数,分别为2,1和0。

通常我发现除了早期原型设计之外,您可能还需要创建自己的ToJSONFromJSON个实例。