Aeson使用的默认ToJson格式的规范

时间:2014-01-15 05:50:09

标签: json haskell ghc template-haskell aeson

有没有人知道我在哪里可以找到关于Aeson的ToJSON如何将ADT翻译成Json的文档?我正在使用Haskell作为后端应用程序,我正在尝试在前端编写另一种函数语言的JSON解码器,所以我想使用相同的JSON格式,以便我可以在它们之间发送消息。 / p>

2 个答案:

答案 0 :(得分:4)

我不认为它有很好的文档记录,但我在类似的情况下通过使用QuickCheck Arbitrary实例生成大量源类型,将它们编码为JSON,然后在类似的情况下获得了很多成功将它们用作前端的黄金标准测试。

您还可以通过Data.Aeson.TH SumEncoding类型中的the configurable Options类型来查看Aeson的模板Haskell编码的工作方式。请特别注意Either,我会解释一下ObjectWithSingleField使用{"Left": 3}进行编码,即Left 3 {{1}}。

答案 1 :(得分:0)

当然,查看QuickCheck生成的案例是一种实用的解决方案。

但是在考虑它时,可以方便地获得可能的翻译选项的概念图。

通过示例,我已经浏览了aesonan answer here generic-aeson中和和类型转换的所有可用选项。

但该例子的细节是数据是记录。如果不是,那么示例中的某些内容可能会发生变化。

所以我的概念图(也许,不完整而且非常正确)是这样的:

  • 如果类型不是非平凡的总和,

    • 但是就像一个newtype(或者只有一个一元数据构造函数),这只是JSON中的无操作。
    • 如果是记录,它就会成为一个对象。
    • 如果它是一个真实的,非平凡的产品类型(而不是记录),那么....(可能是一个数组)。
  • 有一些特殊的基本案例:Maybe a[a],各种String类似的类型,BoolInt - 类似,...

  • 如果类型是一个非平凡的总和,那么重要的是它是否是一个" enum" (有所有无效的建设者)或没有。

    • 枚举被翻译成带有值的字符串;
    • 根据SumEncoding选项的非枚举:
      • 是否是记录也可能有所作为(如第一种非总和)。

请纠正我或填写缺失点。