V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cloudwise
V2EX  ›  监控宝

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

  •  
  •   cloudwise · 2016-07-25 16:20:59 +08:00 · 7236 次点击
    这是一个创建于 2832 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   我们的愿景   ·   实用小工具   ·   957 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:03 · PVG 04:03 · LAX 13:03 · JFK 16:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.