Jsonnet是Google开源的一门配置语言,用于弥补JSON暴露出来的短板,它与JSON完全兼容并加入了一些新特性,包括注释、引用、算术运算、条件操作符、数组和对象深入、引入函数、局部变量、继承等,Jsonnet程序被编译为兼容JSON的数据格式,简单来说Jsonnet就是JSON的增强版。
JSON的应用场景和缺陷
为什么要用Jsonnet取代JSON呢,就要从JSON的功能说起了。JSON (JavaScript Object Notation)是一种轻量级的数据交换格式,是基于ECMAScript的一个子集,采用完全独立于语言的文本格式,同时也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等),由于JSON在各语言间支持友好、可读性强、数据性能上相比xml有很大优势,所以使JSON成为理想的数据交换语言。
JSON的使用场景主要有三类:
✔Web工程师最为熟悉的服务端和javascript的数据交换,常见ajax;
✔ 各语言之间的数据交换,通常以Webservice的形式出现,常见的范式如jsonrpc, 和restful;
✔ 应用的配置文件,很多应用采用json作为配置文件,比如前端bower.-> bower.json. node.js的包管理器package.json ,PHP的包管理器composer.json。
但是在用JSON做数据交换和配置文件时, 也会遇到很多问题:
✔ 不能加注释;
✔ 对象或数组最后一项后面不能有逗号;
✔不支持变量、函数;
✔不能用算术和逻辑运算;
✔不能划分,不能复用,各个json文件之间彼此孤立;
✔ 语法有些时候不太友好;
▶ key必须要加双引号;
▶ value是字符串时,不能用单引号。
JSONNET的优势和应用
JSONNET 的一些特性间接弥补了JSON的先天不足:
✔ key的双引号不是必须的;
✔ 对象和数组最后一个属性后面可以有逗号;
✔支持单行或多行注释;
self: 当前对象
$:根对象
操作数据,支持常用的算术与逻辑运算符
+: 数组(拼接)、字符串(连结)、对象(溶化)
数组和对象深入
模块化
项目配置文件过大或数据文件过大,需要拆分,通过import引入
函数与变量
面向对象--继承
{supper2} + {supper1} + {self}
通过上面特性,我们可以发现JSONNET使JSON拥有了语言的特性:
✔ 有注释,和后端开发协商接口很方便,模拟数据的文件可以直接作为接口文档
✔ 制造模拟数据更加高效自然
✔ 数据文件的可以切分和复用
✔ Web场景下不能作为直接的数据交换格式
✔ 学术型代码, 比较小众
✔ 使用场景不多
✔ 标准库不够完善,存留的issue较多
比如排序问题
✔ 不支持IO操作,不具备替代脚本语言的可能性
✔ 使JSON变得更为复杂
JSONNET提供内置的标准库(官网地址:http://jsonnet.org/docs/stdlib.html ),包括了一系列对象,字符串,BASE64的标准库,大家有兴趣可以自行下载。
目前JSONNET的主要应用场景还是用来组织和生成JSON数据:
✔ 有生成大批量JSON文件的需求
✔ 作为JSON的模板引擎
✔ 接口测试中模拟数据接口,通过JSONNET文件生成动态的JSON数据
JSONNET 在透视宝的应用场景
最后介绍一下JSONNET 在透视宝中的应用场景,透视宝在做数据呈现时主要依赖于后端的ElasticSearch构建的检索服务,ElasticSearch对外提供一组Webservice作为数据API接口,数据交换格式是JSON。
ElasticSearch官方的QUERY DSL代码,相比透视宝实际需求的查询语法并不复杂,但是我们前端在构建这个请求时却不太方便,往往要通过拼接数组的方式将JSON序列化来构建这个QUERY。针对这种情况可以将语法抽象,用oo去构建这样的语法,借助elastica (elastic search 的一个客户端)实现。但是在代码调试中发现,为了构建一个json的查询,我们的程序员在这上面浪费了大量时间,因为要进行大量的语法对照翻译,既不直观,也影响效率。最后我们借助JSONNET 生成JSON文件,将每个查询制作为模板固化下来,复用性大大增加,这种方法在实际工作中效率很高,更加直观:
✔JSON模板引擎
▶ 透视宝前端es query查询
✔模拟数据接口,通过JSONET动态生成JSON数据
✔大数据场景
▶ 数据自行解释
▶ 数据压缩
注:PHP的JSONNET实现是由云智慧的Neeke完成,大家可以参考源码学习一下。
点击“阅读原文”参考源码学习