Google 發明新語言:Jsonnet

發表於2015-05-02

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",
}
{
   "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包

想了解更多,我們推薦閱讀語言規範以及與其它配置語言的對比這篇文章。

相關文章