微信号:infoqchina

介绍:有内容的技术社区媒体

Google开源了配置语言Jsonnet,向后兼容JSON

2015-05-04 11:39 InfoQ



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包。


想了解更多,请点击“阅读原文”,阅读语言与其它配置语言的对比文章。



 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 android MVVM开发模式(四) 浏览器同源政策及其规避方法 理解JavaScript中的依赖注入 IFTTT在开发环境中的Docker使用经验 基于TLS1.3的微信安全通信协议mmtls介绍