GoogleはJsonnetでJSONを強化することを提案しています

Googleは、 Jsonnetプロジェクトのソースコードを 公開 ました。Jsonnetプロジェクトは、標準のJSONを置き換え、下位互換性を損なうことなく新しい機能を追加する構成言語です。 そのような機能には、コメント、リンク、算術演算子、条件演算子、配列、オブジェクトの操作、インポート、関数、ローカル変数などがあります。 Jsonnetプログラムは、JSON互換のデータ形式に変換されます。



コメント JsonnetはC(/ * ... * /)およびC ++(//)のスタイルのコメントを受け入れます



参照資料 selfキーワードは、現在のオブジェクトを参照するために使用できます。 $演算子を使用すると、ルートオブジェクトを使用できます。



算術演算子と条件演算子+演算子は、数字、文字列、配列、およびオブジェクトを追加できます。 ==および!=演算子はtrueまたはfalseを返します。 ifステートメントは3項演算子のように機能しますか?:Cの場合。次に、言語演算子と結果の例をいくつか示します。 例は、プロジェクトページから引用されています

  // bar_menu.3.jsonnet
 {
     foo:3、     
     bar:2 * self.foo、//乗算。
     baz: "値" + self.bar + "is"
          +(self.bar> 5の場合は「大」、それ以外は「小」)+「。」、
    配列:[1、2、3] + [4]、
     obj:{a:1、b:2} + {b:3、c:4}、
    等式:1 == "1"、
 }


結果:

  {
    「foo」:3
    「バー」:6
    "baz": "値6は大きい。"、
    「配列」:[1、2、3、4]、
    「obj」:{a:1、b:3、c:4}、
    「平等」:false
 }


配列とオブジェクトの作成 。 配列とオブジェクトを作成するには、次の例に示すように、forステートメントで構成を使用します。

  {
     foo:[1、2、3]、
     bar:[x> = 2の場合、self.fooのxのx x x]、
     baz:{["field" + x]:self.fooのxのx}、
     obj:{["foo" + "bar"]:3}、
 }




結果:

  {
    「foo」:[1、2、3]、
    「バー」:[4、9]、
    「baz」:{
       「field1」:1、
       「field2」:2
       「field3」:3
    }、
    「obj」:{「foobar」:3}
 }


モジュール性 。 Jsonnetコードは複数のファイルに分割し、importステートメントを使用してマージできます。 内部メカニズムは、単にファイルを接着するだけです。



機能 Jsonnet値には関数が含まれる場合があります。 これらは非表示フィールドとしてマークされ、JSONに変換されません。 そのような関数の例を以下に示します。

  // bar_menu_utils.jsonnet
 {
     equal_parts(サイズ、成分)::
         std.length(成分)== 0の場合
            エラー「成分が指定されていません。」
        その他[
             {種類:i、qty:サイズ/ std.length(成分)}
            私は食材に
         ]、
     id ::関数(x)x、
 }


Jsonnetには、インポート、計算フィールド、オプションフィールドを使用してオブジェクトを継承するローカル変数も含まれています。



言語エンジンはC ++ 11で記述されており、他の言語への移植を容易にするCスタイルAPIラッパーが用意されています。 開発チームは、CおよびPythonのライブラリをすぐに提供できます。 C ++の実装は、Emscriptenを使用してJSでコンパイルできます。 nodejsの非公式パッケージも利用できます。



完全な仕様は、 仕様ページで確認できます。



他の言語との比較



JSON 実際、JSONはすべてのデータを文字通り記述します。 Jsonnetには、ユーザーがデータを読みやすくするための、より自由な構文とコメントがあります。



Yaml また、正しいJSONを生成できるJSON拡張機能でもあります。 言語の構文は非常にコンパクトであり、YAMLファイルはJSON形式で出力されるよりもはるかに短くなります。 この言語はJsonnetと同じ目的で作成されたという事実にもかかわらず、データの作成、翻訳、および改良はJsonnetに失われます。 特に、YAMLとJsonnetは、「1 + 1」の意味について異なる視点を持っています。 YAMLはこれが文字列「1 + 1」であると言いますが、Jsonnetは結果が2であるべきだと考えています。



パターンを持つ他の言語。 Jsonnetは、リテラルデータと計算構造をインターリーブするアルゴリズムによってデータを生成するテンプレート言語です。 これらの言語のほとんどは、プログラムと結果をプレーンテキストと見なします。 これは、JSONについて話している場合、出力が誤った結果を生成する可能性があることを意味します。 これらのテンプレート言語のほとんどには、出力データの構文に関する知識がなく、結果の正確性を確認できません。 Jsonnetは非常に特殊なツールであるため、このような欠陥はありません。



Haskel、Nix、Coil、Pystachioなどの他のツールや言語との比較は、Jsonnetマニュアルで詳しく読むことができます。



質疑応答



元のトピックでは、プロジェクトの主任開発者であるDavid Cunninghamから興味深い質問と回答が表示されました。



質問既存のオープン EDN 標準を活用してみません か? 私の意見では、すべて同じ機能を備えており、すでに異なる言語用のポートがあります。



回答 :良い質問ですが、EDNはJsonnetにあまり似ていません。 EDNは「データのみ」であり、計算や抽象化については何も知りません。 これは拡張可能であり、欠落している構成要素を追加できますが、実際には、他のシステムでは理解できない新しい言語を受け取ります。



Jsonnetを作成したとき、共通の標準に従う必要があると考えました。 人気のためJSONを選択しましたが、既存のプログラミングモデル(主にjsとpython)を可能な限り忠実に追うことも試みました。



また、システムを使用してEDNを生成できるため、JsonnetをEDNで動作するシステムに統合できることにも注意してください。 特別な関数「マニフェスト」を記述するだけです。 このような作業は、INIファイル、LuaおよびPython構成ファイルに対して行われています。



最後に、Jsonnetは3つの言語(C、Python、Javascript)およびCインターフェースで動作可能なすべての言語で利用可能です。 他の言語への移植が計画されており、おそらくHaxeへの移植が予定されています。



質問 私はプロジェクトが本当に好きですが、開発者は標準のJavaScript 関数 を使用 する必要があり、stdlibで発明する必要はありません 基本的な機能が欠落しており、新しい機能を追加するのは簡単な作業ではないため、これは一種のリミッターであり、残念ながら、古いJSONプリプロセッサーに戻りました。



答え 。 Stdlibは間違いなくプロジェクトの最も弱い部分であり、バージョン1.0をリリースする前に書き直し、改善し、文書化する必要があるものです。 特に実際の例で、フィードバックをお待ちしています。



一般に、stdlibを自分で拡張し、Jsonnet用の独自のライブラリを作成することができます。 以下の例では、最初にちょっとしたトリックを使用して、add2メソッドをstdlibに追加します。

  local std2 = std {//自己参照を回避するために一時的にstd2を定義します。
    add2(x):: x + 2、
 };
ローカルstd = std2;  // stdにstd2をバインドします。

 //以下のJsonnetファイルの残り:
 {
    foo:std.add2(10)、// 12に展開されます。
 }


一般に、Jsonnetではセマンティクスが意味をなさない可能性があるため、サポートされている言語から関数をコピーすることはできない場合があります。 しかし、不当な違いがあってもだれにも役に立たないことを理解しています。 これが、テキストの書式設定を行うstdlib関数がPythonの%演算子と完全に一致する主な理由です。




材料に基づく:





また、次回のAPI&バックエンド (C#)カンファレンスに注目してください。 APIの実装と管理、バックエンドのサービスの詳細について何か伝えたいことがある場合。 複雑なメッセージの生成に関連する興味深いケースがある場合:ヘッダーとコンテンツ- 私たちはあなたの物語を待っています



All Articles