Aeson の ToJSON によって ADT がどのように Json に変換されるかについてのドキュメントをどこで見つけることができるか知っている人はいますか? バックエンド アプリケーションに Haskell を使用しており、フロント エンドで別の関数型言語の JSON デコーダーを作成しようとしています。そのため、同じ JSON 形式を使用してそれらの間でメッセージを送信できるようにしたいと考えています。
2 に答える
十分に文書化されているとは思いませんが、QuickCheckArbitrary
インスタンスを使用して多数のソース タイプを生成し、それらを JSON にエンコードしてから、それらをゴールド スタンダード テストとして使用することで、同様の状況で多くの成功を収めました。あなたのフロントエンドのために。
また、Aeson の Template Haskell エンコーディングがどのように機能するかについて、 の構成可能なOptions
型を覗いてみると、ある程度の直感を得ることができますData.Aeson.TH
。具体的には、SumEncoding
たとえば、 for を使用してエンコードされていることについて説明しEither
ます。ObjectWithSingleField
{"Left": 3}
Left 3
もちろん、QuickCheck によって生成されたケースを見ることは、一種の実用的なソリューションです。
しかし、考えてみると、考えられる翻訳オプションの概念図があると便利です。
合計型の変換に使用できるすべてのオプションを、aeson
こちらgeneric-aeson
の回答で例を挙げて説明しました。
しかし、その例の詳細は、データがレコードであるということです。そうでない場合、例で何かが変わる可能性があります。
したがって、私の概念図 (おそらく完全ではなく、まだかなり正しい) は次のようになります。
型が非自明な合計でない場合、
- しかし、これは newtype のようなもの (または単項データ コンストラクターが 1 つある) であり、JSON では単純に no-op です。
- レコードの場合はオブジェクトになります。
- それが実際の自明でない製品タイプ (およびレコードではない) の場合、.... (おそらく配列)。
特別な基本ケースがあります:
Maybe a
、[a]
、さまざまString
な のような型、Bool
、 のInt
ような、...型が非自明な合計である場合、それが「列挙型」(すべての nullary コンストラクターを持つ) であるかどうかが重要です。
- 列挙型は、値を含む文字列に変換されます。
SumEncoding
オプション による非列挙型:- それがレコードであるかどうかも違いを生む可能性があります(非合計の最初のケースのように)。
私を修正するか、不足している点を埋めてください。