我通常编写自己的ToJSON
实例FromJSON
,但我决定使用deriveJSON
类型,因为它非常简单:
data Priority = HIGH | MEDIUM | LOW deriving Show
$(deriveToJSON id ''Priority)
main = BS.putStrLn . encode $ HIGH
我本来希望JSON
推导只是将枚举写为字符串。相反,它是哈希的关键!{"HIGH":[]}
为什么这是默认行为?
这是因为aeson
不区分像您这样的 sum 类型Priority
和像data PriorityAndDetails = HIGH { highReason :: Text, alertType :: Alert } | MEDIUM { personResponsible :: Person } | LOW
. 从根本上说,这些类型中的每一个都是“只是一个带有n 个参数的数据构造函数”。
在Priority
HIGH
、MED
和LOW
中,每个都只是具有零参数的数据构造函数。在PriorityAndDetails
HIGH
、MED
和LOW
中,每个都只是具有一定数量的命名参数的数据构造函数,分别为 2、1 和 0。
一般来说,我发现除了早期原型设计之外,您可能需要创建自己的实例ToJSON
和实例。FromJSON