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

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的使用场景主要有三类:

l Web工程师最为熟悉的服务端和javascript的数据交换,常见ajax;

l 各语言之间的数据交换,通常以Webservice的形式出现,常见的范式如jsonrpc, 和restful;

l 应用的配置文件,很多应用采用json作为配置文件,比如前端bower.-> bower.json.  node.js的包管理器package.json ,PHP的包管理器composer.json。

但是在用JSON做数据交换和配置文件时, 也会遇到很多问题:

l 不能加注释;

l 对象或数组最后一项后面不能有逗号;

l 不支持变量、函数;

l 不能用算术和逻辑运算;

l 不能划分,不能复用,各个json文件之间彼此孤立;

l 语法有些时候不太友好;

  • key必须要加双引号;
  • value是字符串时,不能用单引号。

JSONNET的优势和应用

JSONNET 的一些特性间接弥补了JSON的先天不足:

l key的双引号不是必须的;

l 对象和数组最后一个属性后面可以有逗号;

l 支持单行或多行注释;

引用

self: 当前对象

$:根对象

操作数据,支持常用的算术与逻辑运算符

+: 数组(拼接)、字符串(连结)、对象(溶化)

数组和对象深入

模块化

项目配置文件过大或数据文件过大,需要拆分,通过import引入

函数与变量

面向对象--继承

{supper2} + {supper1} + {self}

通过上面特性,我们可以发现JSONNET使JSON拥有了语言的特性:

优点

ü 有注释,和后端开发协商接口很方便,模拟数据的文件可以直接作为接口文档

ü 制造模拟数据更加高效自然

ü 数据文件的可以切分和复用

缺点

² Web场景下不能作为直接的数据交换格式

² 学术型代码, 比较小众

² 使用场景不多

² 标准库不够完善,存留的issue较多

u 比如排序问题

² 不支持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文件,将每个查询制作为模板固化下来,复用性大大增加,这种方法在实际工作中效率很高,更加直观:

l JSON模板引擎

n 透视宝前端es query查询

l 模拟数据接口,通过JSONET动态生成JSON数据

l 大数据场景

n 数据自行解释

n 数据压缩

注:PHP的JSONNET实现是由云智慧的Neeke完成:  http://pecl.php.net/package/jsonnet,大家可以参考源码学习一下。

 

转载于:https://my.oschina.net/cloudwise/blog/717764

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值