什么是Jsonnet
Jsonnet是Google开源的一门配置语言,用于弥补JSON所暴露的短板,它完全兼容JSON,并加入了JSON所没有的一些特性,包括注释、引用、算数运算、条件操作符、数组和对象深入、引入函数、局部变量、继承等,Jsonnet程序被编译为兼容JSON的数据格式。简单来说Jsonnet就是增强版JSON。
JSON的应用场景跟缺陷
JSON是一种轻量级的数据交换格式,是基于ECMAScript的一个子集,采用完全独立于语言的文本格式,同时也是用了类C的习惯,JSON在各语言间支持友好,可读性强,数据性能比XML好,所以JSON成为目前非常广泛的数据交换格式。
- 使用场景
- 前后端数据交互
- 各语言之间的数据交互
- 应用的配置文件
- 缺陷
- 不能加注释
- 对象或数组最后一项后面不能有逗号
- 不支持变量、函数
- 不能用算数和逻辑运算
- 不能划分,复用,文件隔离
- key必须加双引号
- value为字符时必须用双引号
Jsonnet对这些缺陷做了弥补,key的双引号不是必须,对象和数组最后一个属性可以有逗号,支持注释,支持算数运算等等。
Jsonnet功能
-
注释
Jsonnet支持单行或多行注释/* This is demo comment*/ { //This comment show for test key1:{ "tom":[ {kind:"man",test:1.0}, ] } }
-
引用
Jsonnet中可以通过self引用当前对象,$引用根对象
{ test:{ data:"data1", data2: self.data }, test1:{ data:$.test.data } }
-
数据操作
支持逻辑运算与算数运算
{ foo:4, bar: 2*self.foo, bar2:"this value is "+ self.bar+"." arrays:[1,2,3]+[4,5]//拼接 equal: 1== 2 }
-
数组和对象深入
{ foo:[1,2,3], bar:[x*x for x in self.foo if x>=2], bar2:{["field"+x]: x for x in self.foo}, obj:{["foo"+"bar"]:3}, }
-
模块化
Jsonnet文件可进行拆分,拆分成多个小文件,每个文件里又是一个Jsonnet对象,通过import进行引入使用
-
函数与变量
//函数demo { qual_demo(size,value):: if std.length(value) == 0 then error "no data" else [ {kind: i,data: size/std.length(value)} for i in value ] id:: function(x) x, }
//变量demo { local my_data = "data", data:{ demo:my_data } }
-
面向对象继承
{ demo:{ data:"data1", }, demo2: self["demo"]+{ data2:"hello" } }
总结
Jsonnet加入了注释,等功能,拥有了语言的特性,制造模拟数据时更加高效方便,但是Jsonnet无法再web场景下作为直接的数据交换格式,并且比较小众,使用场景相对较少,标准库也不够完善,也变得更为复杂
感谢阅读这份文档