Googleは、互換性を維持しつつ、新しい機能を追加したJSONに取って代わる設定言語であるJsonnetをオープンソース化した: コメント、参照、演算と条件演算子、配列、オブジェクト内包表記、インポート、関数、ローカル変数、継承など。Jsonnetプログラムは、JSON準拠データフォーマットに変換される。
コメント Jsonnetは、C(/* ….*/
)とC++ (//…
)の両方のコメントスタイルを許容する。
参照。 self
キーワードは現在のオブジェクトを参照、$
オペレーターはルートオブジェクトを参照する
演算と条件演算子。+
演算子、加算、文字列、配列、オブジェクト。==
または!=
演算子とtrue
かfalse
かの評価。if
は、Cの三項演算子?:
のように動作する。以下は、いくつかのJsonnet演算子と言語の例から抽出した結果のJSONコード:
// bar_menu.3.jsonnet
{
foo: 3,
bar: 2 * self.foo, // Multiplication.
baz: "The value " + self.bar + " is "
+ (if self.bar > 5 then "large" else "small") + ".",
array: [1, 2, 3] + [4],
obj: {a: 1, b: 2} + {b: 3, c: 4},
equality: 1 == "1",
}
{
"foo": 3,
"bar": 6,
"baz": "The value 6 is large.",
"array": [1, 2, 3, 4],
"obj": {a: 1, b: 3, c: 4},
"equality": false
}
配列とオブジェクトの構築。for
は、以下のサンプルに示される配列とオブジェクトを構築する:
{
foo: [1, 2, 3],
bar: [x * x for x in self.foo if x >= 2],
baz: { ["field" + x]: x for x in self.foo },
obj: { ["foo" + "bar"]: 3 },
}
{
"foo": [ 1, 2, 3 ],
"bar": [ 4, 9 ],
"baz": {
"field1": 1,
"field2": 2,
"field3": 3
},
"obj": { "foobar": 3 }
}
モジュール。Jsonnetコードは複数のファイルに分割することができ、import
を使ってアクセスされる。インポートされたオブジェクトは、+
を使って他のオブジェクトと連結される。
関数。Jsonnetの値には、JSONに翻訳されない隠しフィールドとして関数を含めることができる。関数は様々な評価のために使用することができる。例はここで見ることができる。
Jsonnetはまた、ローカル変数、インポートや結合演算子+
を使ってオブジェクトを継承する方法、計算されたフィールドとオプショナルフィールドの機能を持つ。
Jsonnet言語エンジンはC++11で実装されていて、他の言語に簡単に移植できるようにC APIでラップされている。CとPythonライブラリは提供されている。C++実装はEmscriptenでJavaScriptにコンパイルされ、非公式のnodejsパッケージが公開されている。
詳細は、言語仕様と他の設定言語との比較をお薦めする。