Google 对象描述语言 Jsonnet 应用经验谈

2016-07-25 16:20:59 +08:00
 cloudwise
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 完成: http://pecl.php.net/package/jsonnet
大家可以参考源码学习一下。

7243 次点击
所在节点    监控宝
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/294793

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX