对于枚举,Aeson 的导出JSON 无法按预期工作

Vla*_*ala 3 haskell aeson

我通常写我自己ToJSONFromJSON实例,但我决定用deriveJSON一个类型,因为它是如此简单:

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

main = BS.putStrLn . encode $ HIGH
Run Code Online (Sandbox Code Playgroud)

我本来希望JSON推导只是将枚举写为字符串。相反,它是哈希的关键!{"HIGH":[]}

为什么这是默认行为?

J. *_*son 5

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

In Priority HIGH, MED, 和LOW每个都只是具有零参数的数据构造函数。在PriorityAndDetails HIGHMEDLOW中,每个都只是具有一定数量命名参数的数据构造函数,分别为 2、1 和 0。

通常我发现,你可能需要创建自己ToJSONFromJSON实例因为除了早期原型任何东西。