Jsonnet是Google开源的一门配置语言,用于弥补JSON所暴露的短板,它完全兼容JSON,并加入了JSON所没有的一些特性,包括注释、引用、算数运算、条件操作符、数组和对象深入、引入函数、局部变量、继承等,Jsonnet程序被编译为兼容JSON的数据格式。简单来说Jsonnet就是增强版JSON。
JSON是一种轻量级的数据交换格式,是基于ECMAScript的一个子集,采用完全独立于语言的文本格式,同时也是用了类C的习惯,JSON在各语言间支持友好,可读性强,数据性能比XML好,所以JSON成为目前非常广泛的数据交换格式。
注释
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场景下作为直接的数据交换格式,并且比较小众,使用场景相对较少,标准库也不够完善,也变得更为复杂
感谢阅读这份文档