Google提議使用Jsonnet來增強JSON

n6bg 9年前發布 | 10K 次閱讀 Jsonnet

英文原文: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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!