4

有谁知道我在哪里可以找到关于 Aeson 的 ToJSON 如何将 ADT 转换为 Json 的文档?我正在将 Haskell 用于后端应用程序,并且我正在尝试在前端为另一种功能语言编写 JSON 解码器,因此我想使用相同的 JSON 格式,以便可以在它们之间发送消息。

4

2 回答 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 回答