Google对象描述语言Jsonnet应用经验谈
发布于 8 年前 作者 cloudwise123 2936 次浏览 来自 分享

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的双引号不是必须的; 对象和数组最后一个属性后面可以有逗号; 支持单行或多行注释; 图片1.png 引用 self: 当前对象 $:根对象 图片2.png

操作数据,支持常用的算术与逻辑运算符 +: 数组(拼接)、字符串(连结)、对象(溶化) 图片3.png 数组和对象深入 图片4.png

模块化 项目配置文件过大或数据文件过大,需要拆分,通过import引入 图片5.png 函数与变量 图片6.png

面向对象–继承 {supper2} + {supper1} + {self} 图片7.png 通过上面特性,我们可以发现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完成: http://pecl.php.net/package/jsonnet,大家可以参考源码学习一下。

二维码.jpg

回到顶部