ErlangのJSONシリアル化ライブラリ

私たちの活動ではオープンソースソリューションを非常に積極的に使用しているため、逆のプロセスは非常に自然です。つまり、当社で作成したライブラリとコンポーネントを無料ライセンスの下で公開します。



今回は、Erlangデータ型のJSONシリアル化ライブラリ、著者si14をBSD 2条項ライセンスの下で公開しています。 このライブラリを作成するプロジェクトはまだ準備ができていません(秋までに発表を待つ)が、ライブラリはすでに完全に独立しており、他の多くの場合に使用できます。 伝統的に、私たちは改善における協力を楽しみにしており、他のプロジェクトへの応用について興味を持って聞きます。



アーランの荒野で

多くの動的言語とは異なり、Erlangには関数とレコードのオプションの型注釈があります。 現時点では、少なくとも3つのユーティリティで使用されています:edoc(ソースからドキュメントを生成します;結果のドキュメントの例はここにあります 、例えば)、さらに重要なことには、dialyzer(既存の型情報を分析し、宣言された矛盾を含む型不一致エラーを報告します)および推論型)およびPropEr(型情報に基づいてテストを自動的に生成し、関数のプロパティを宣言的に設定するシステム)。 これらの宣言の使用は良い形の規則になっているので、Erlangのほとんどすべての高品質プロジェクトにはそれらがあります。 他の場所で型情報を使用することは可能ですか?



ジェーン

プロジェクトの1つを開発する過程で、アイデアが生まれました。JSで既存の型情報を直接使用しないのはなぜですか (例:フォームの描画またはデータ検証用)? おなじみの開発者の電撃調査では、このアイデアは「宙に浮いている」ことを確認しましたが、標準的なソリューションはありません。 次に、JANEが登場しました。JSONを使用してレコードに関する情報をコーディングするための標準を記述しようとする試みです。 JANEは特にBERTとうまく組み合わされ、JSでErlang用語を使用してほぼ透過的に作業できます。



フォーマットと現在の実装

現在の形式の実装は、レコードの説明を含む.hrlファイルへのパスを取得し、結果の.jsonファイルをpriv / recordsフォルダーに書き込む実行可能なescriptです。 ファイル内のレコードの各定義は、レコードの名前に等しいキーと、特定のレコードを値として記述するディクショナリを持つトップレベルのディクショナリの要素としてエンコードされます。

特定のレコードの説明は、キーとしてフィールドの名前を持ち、値としてこのフィールドの説明を持つ辞書です。

フィールドの説明は、タイプ仕様を含む必須タイプキーと、レコード仕様のフィールドにデフォルト値が指定されている場合に指定されるオプションのデフォルトキーを持つディクショナリです。

型仕様は、型名に等しいキーと型引数のリストに等しい値を持つ辞書です(型引数も含まれる場合があります)。

デフォルトでは、レコード内のすべてのフィールドタイプは、指定されたタイプとアトム未定義の和集合として定義されます。 これは必ずしも便利ではないため、現在の実装ではignore_undefinedパラメーターを受け入れ、undefinedが存在する場合は無視します。

rebarをポストコンパイルフックとして使用する例:

{post_hooks, [{'compile', './priv/recordparser ignore_undefined include/test.hrl'}]}.
      
      





レコード定義:

 -record(params_ping, {host :: nonempty_string()}). -record(params_tcp, {host :: list(atom()), port = 80 :: pos_integer(), timeout :: pos_integer()}).
      
      





.jsonでの翻訳結果(ignore_undefinedを使用):

 { "params_ping": { "host": { "type": { "nonempty_string": [] } } }, "params_tcp": { "host": { "type": { "list": [ { "atom": [] } ] } }, "port": { "type": { "pos_integer": [] }, "default": 80 }, "timeout": { "type": { "pos_integer": [] } } } }
      
      





同じですが、ignore_undefinedなし:

 { "params_ping": { "host": { "type": { "union": [ { "atom": [ "undefined" ] }, { "nonempty_string": [] } ] } } }, "params_tcp": { "host": { "type": { "union": [ { "atom": [ "undefined" ] }, { "nonempty_string": [] } ] } }, "port": { "type": { "pos_integer": [] }, "default": 80 }, "timeout": { "type": { "union": [ { "atom": [ "undefined" ] }, { "pos_integer": [] } ] } } } }
      
      







リンクと人

Githubリポジトリのライブラリコード: github.com/selectel/jane

ライブラリの作成者: si14

伝統的に、BSDライセンスに同意してくれたakmeに感謝します。



All Articles