文档章节

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

cloudwiseAPM
 cloudwiseAPM
发布于 2016/07/25 15:34
字数 1271
阅读 67
收藏 2

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,大家可以参考源码学习一下。

 

© 著作权归作者所有

共有 人打赏支持
cloudwiseAPM
粉丝 27
博文 135
码字总数 278629
作品 0
海淀
私信 提问
Jsonnet-PHP v1.2.0 发布, PHP 支持 Jsonnet 扩展

Jsonnet-PHP v1.2.0发布了,JsonNet-PHP是Google Jsonnet对PHP的支持扩展,该版本使用最新版本至v0.9.5的LibJsonnet。 pecl: http://pecl.php.net/package/jsonnet github: https://github.c......

Neeke
2017/11/29
749
0
Jsonnet-PHP v1.3.0 发布,支持 PHP 7 使用 Jsonnet

JsonNet-PHP 是 Google Jsonnet 对 PHP的支持扩展. pecl: http://pecl.php.net/package/jsonnet github: https://github.com/Neeke/Jsonnet-PHP gitee: https://gitee.com/neeke/Jsonnet-PHP......

Neeke
2018/03/30
1K
1
Jsonnet-PHP v1.1.0 发布, PHP 的支持扩展

Jsonnet-PHP v1.1.0 发布了,JsonNet-PHP 是 Google Jsonnet 对 PHP的支持扩展,v1.1.0,使用最新版本至v0.8.9的LibJsonnet。 pecl: http://pecl.php.net/package/jsonnet github: https://......

Neeke
2016/07/14
2.4K
4
意外收到 Google PR,Jsonnet-PHP v1.3.1 发布

由于意外地收到了Google一名工程师的PR(https://github.com/Neeke/Jsonnet-PHP/pull/6),Jsonnet-PHP发布了1.3.1版本。 此次PR内容为: Fixed capitalization: JsonNet -> Jsonnet Added l......

Neeke
2018/05/27
1K
3
Jsonnet 的 PHP 扩展-Jsonnet-PHP

JsonNet-PHP 是 Google Jsonnet 对 PHP的支持扩展. pecl: http://pecl.php.net/package/jsonnet github: https://github.com/Neeke/Jsonnet-PHP Google Jsonnet Tutorial jsonnet语言,从其最......

蝙蝠
2015/06/01
946
0

没有更多内容

加载失败,请刷新页面

加载更多

equals()的重写规则

自反性。对于任何非null的引用值x,x.equals(x)应返回true。 对称性。对于任何非null的引用值x与y,当且仅当:y.equals(x)返回true时,x.equals(y)才返回true。 传递性。对于任何非null的引用...

无精疯
14分钟前
0
0
Go基础系列:双层channel用法示例

双层通道的解释见Go的双层通道 以下是一个双层通道的使用示例。注意下面的示例中使用了"信号通道"(Signal channel),但这里的信号通道是多余的,仅仅只是为了介绍。 信号通道不用来传递数据,...

echojson
22分钟前
0
0
PHP文件上传error的错误类型

PHP文件上传error的错误类型 - $_FILES['file']['error'] 有以下几种类型 1、UPLOAD_ERR_OK 其值为 0,没有错误发生,文件上传成功。 2、UPLOAD_ERR_INI_SIZE 其值为 1,上传的文件超过了 ph......

小良下山化了个缘
48分钟前
2
0
分布式项目(四)Mapping Server 数据映射

上回说道CoAp client和server的实现,数据也安装定义的格式发送到了kafka中,接下来就是Mapping server的实现,物理设备数据映射到抽象设备上,并赋予数据业务含义。 iot-mapping 构建iot-m...

lelinked
58分钟前
3
0
使用data pump驱动的外部表移动数据

使用data pump驱动的外部表移动数据 比如我们有一个报表的数据,准备从一个数据库A中移动到另一个数据库B中,如何实现? 这个问题,我们使用带data pump驱动的外部表方式,很容易实现,具体方法如下...

突突突酱
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部