Google 对象描述语言 Jsonnet 应用经验谈 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cloudwise
V2EX    监控宝

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

  •  
  •   cloudwise 2016-07-25 16:20:59 +08:00 7615 次点击
    这是一个创建于 3433 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    大家可以参考源码学习一下。

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1289 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 17:09 PVG 01:09 LAX 09:09 JFK 12:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86