有谁知道我在哪里可以找到关于 Aeson 的 ToJSON 如何将 ADT 转换为 Json 的文档?我正在将 Haskell 用于后端应用程序,并且我正在尝试在前端为另一种功能语言编写 JSON 解码器,因此我想使用相同的 JSON 格式,以便可以在它们之间发送消息。
问问题
182 次
2 回答
4
我不认为它有很好的文档记录,但是通过使用 QuickCheckArbitrary
实例生成大量源类型,将它们编码为 JSON,然后将它们用作黄金标准测试,我在类似情况下取得了很多成功为您的前端。
您还可以通过Options
查看. Data.Aeson.TH
特别是看一下SumEncoding
哪个让我解释一下,例如,使用,即for 进行Either
编码。ObjectWithSingleField
{"Left": 3}
Left 3
于 2014-01-15T05:57:11.280 回答
0
当然,查看 QuickCheck 生成的案例是一种实用的解决方案。
但是在考虑它时,对可能的翻译选项有一些概念性的图片是很方便的。
我已经浏览了所有可用选项,用于在此处的答案中和答案中翻译总和类型,并附aeson
有示例。generic-aeson
但该示例的细节是数据是记录。如果不是,示例中的某些内容可能会发生变化。
所以我的概念图(可能还不完整且完全正确)是这样的:
如果类型不是非平凡的和,
- 但就像一个新类型(或具有单个一元数据构造函数),这只是 JSON 中的一个空操作。
- 如果它是一个记录,它就成为一个对象。
- 如果它是一个真实的、非平凡的产品类型(而不是记录),那么......(可能是一个数组)。
有特殊的基本情况:
Maybe a
,[a]
, 各种String
-like 类型,Bool
,Int
-like, ...如果类型是一个不平凡的总和,那么它是否是“枚举”(具有所有空构造函数)很重要。
- 枚举被翻译成带有值的字符串;
SumEncoding
根据选项 的非枚举:- 它是否是记录也可能会有所不同(例如第一种非总和)。
请纠正我或完成缺失的点。
于 2015-03-30T02:29:37.613 回答