写点什么

Google 提议使用 Jsonnet 来增强 JSON

  • 2015-04-29
  • 本文字数:1082 字

    阅读完需:约 4 分钟

Google 开源了一门配置语言 Jsonnet 来取代 JSON,它完全向后兼容并加入了一些新特性:注释、引用、算术运算、条件操作符,数组和对象内含,引入,函数,局部变量,继承等。Jsonnet 程序被翻译为兼容 JSON 的数据格式。

注释:Jsonnet 接受两种风格的注释——C 风格(/* …. */)和 C++ 风格(//… )。

引用:关键字 self 引用当前对象,操作符 $ 引用根对象。

算术运算和条件运算符:运算符 + 可以计算数字和,拼接字符串、数组和对象;运算符 == 和!= 用来判别 true 或 false。运算符 if 与 C 语言中的三元表达式 ? : 类似。下面是一些 Jsonnet 运算符和转译后的 JSON 代码示例(借鉴了官方语言示例):

复制代码
// bar_menu.3.jsonnet
{
foo: 3,
bar: 2 * self.foo, // Multiplication.
baz: "The value " + self.bar + " is "
+ (if self.bar > 5 then "large" else "small") + ".",
array: [1, 2, 3] + [4],
obj: {a: 1, b: 2} + {b: 3, c: 4},
equality: 1 == "1",
}
复制代码
{
"foo": 3,
"bar": 6,
"baz": "The value 6 is large.",
"array": [1, 2, 3, 4],
"obj": {a: 1, b: 3, c: 4},
"equality": false
}

构建数组和对象:构造器 for 可以用来构建数组和对象,下面是示例:

复制代码
{
foo: [1, 2, 3],
bar: [x * x for x in self.foo if x >= 2],
baz: { ["field" + x]: x for x in self.foo },
obj: { ["foo" + "bar"]: 3 },
}
复制代码
{
"foo": [ 1, 2, 3 ],
"bar": [ 4, 9 ],
"baz": {
"field1": 1,
"field2": 2,
"field3": 3
},
"obj": { "foobar": 3 }
}

模块化:Jsonnet 编写的代码可以分割为多个文件,使用 import 进行访问,引入的对象可以使用运算符 + 进行拼接。

函数:Jsonnet 的值可以包含函数,这部分会被标记为隐藏字段并且不被翻译到 JSON 中。函数被用于多项评估,点击这里查看示例。

Jsonnet 同样支持局部变量、引入式对象继承、运算符 + 拼接、可计算和可选字段等特性。

Jsonnet 语言引擎使用 C++11 进行实现,为了便于移植到其它语言中使用 C 语言 API 进行了封装,目前提供 C 和 Python 的库。C++ 实现的引擎可以通过 Emscripten 编译为 JavaScript 代码,你也可以在 Node.js 中使用非官方的 npm 包

想了解更多,我们推荐阅读语言规范以及与其它配置语言的对比这篇文章。

查看英文原文: Google Proposes to Enhance JSON with Jsonnet


感谢邵思华对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-04-29 09:149183
用户头像

发布了 63 篇内容, 共 135.3 次阅读, 收获喜欢 38 次。

关注

评论

发布
暂无评论
发现更多内容

Maven进阶(四):Maven 常用命令

No Silver Bullet

maven 12月日更

Servlet的生命周期

JavaEdge

12月日更

团队基建系列 - 组织知识传承 5 底层逻辑

搬砖的周狮傅

团队 团队成长

你只认识大众汽车的车标怎么能行?赶紧用python采集所有车标学习一下

梦想橡皮擦

12月日更

SQL优化和索引

lixiaofeng

SQL优化 索引优化 内容合集 签约计划第二季

MySql优化:详细解读InnoDB存储引擎

秋水

MySQL性能优化 内容合集 签约计划第二季 MySQL InnoDB

区块链,开启智慧养老新时代

CECBC

Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理

汪子熙

Java 设计模式 代理模式 28天写作 12月日更

100+行业大牛,Qcon全球软件开发者大会参会记录

看点代码再上班

技术 互联网 软件开发 Qcon

模块六作业

doublechun

「架构实战营」

Redis 实战:巧用 Bitmap 实现亿级数据统计

码哥字节

redis BitMap 签约计划第二季

【Promise 源码学习】第十七篇 - async/await 简介

Brave

源码 Promise 12月日更

10.《重学JAVA》--控制语句(二)

杨鹏Geek

Java 25 周年 28天写作 12月日更

字典树之旅03.Patricia Trie(一)

极客志

Java 自然语言处理 数据结构 算法 字典树

RPC学习笔记

风翱

RPC 12月日更

Redis持久化策略——AOF

蝉沐风

redis 持久化 aof

Android Lottie 中秋月饼变明月动画特效

阿策小和尚

28天写作 Android 小菜鸟 12月日更

1-7聚合架构第八讲:ADM被骂的冤吗?

钰湚—付晓岩

企业架构 业务架构 聚合架构

如何决定响应式网站的 CSS 单位?

海拥(haiyong.site)

响应式 大前端 28天写作 签约计划第二季 12月日更

模块二作业

Geek_e6f7f6

架构训练营

设计模式【5】-- 原型模式

秦怀杂货店

Java 编程 设计模式 原型模式

【分布式技术专题】「分布式ID系列」百度开源的分布式高性能的唯一ID生成器UidGenerator

码界西柚

唯一ID 12月日更 UidGenerator 服务ID 百度技术

🏆视差特效的原理和实现方法

德育处主任

JavaScript 前端 特效 前端特效 css特效

Redis 核心原理与实战总结系列

码哥字节

Redis 6.0 技术专题合集

dart系列之:实时通讯,在浏览器中使用WebSockets

程序那些事

flutter dart HTTP 程序那些事 12月日更

升级你的高手秘籍,在找到规律的同时,你需要把时间整个明白。

叶小鍵

给弟弟的信第9封|初入职场攻略

大菠萝

28天写作

创业合伙人的选择和经营

wood

创业 合伙人 28天写作

设计消息队列存储消息数据的 MySQL 表格

胡颖

1-8聚合架构第九讲:我们聊聊4个A?

钰湚—付晓岩

企业架构 业务架构 聚合架构

MySql优化:MySQL体系结构及存储引擎总结

秋水

MySQL性能优化 内容合集 签约计划第二季

Google提议使用Jsonnet来增强JSON_JavaScript_Abel Avram_InfoQ精选文章