Google提議使用Jsonnet來增強JSON
英文原文:Google Proposes to Enhance JSON with Jsonnet
Google 開源了一門配置語言 Jsonnet 來取代 JSON,它完全向后兼容并加入了一些新特性:注釋、引用、算術運算、條件操作符,數組和對象內含,引入,函數,局部變量,繼承等。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",
}</pre>
-
{ "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 代碼,你也可以在 Node.js 中使用非官方的 npm 包。
想了解更多,我們推薦閱讀語言規范以及與其它配置語言的對比這篇文章。
來自: InfoQ本文由用戶 n6bg 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!