写点什么

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:149315
用户头像

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

关注

评论

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

Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 实现分库分表

简爱W

LeetCode题解:26. 删除排序数组中的重复项,双指针,JavaScript,详细注释

Lee Chen

大前端 LeetCode

十一周作业

olderwei

极客大学架构师训练营

你可能不知道的计算机基础

书旅

c 常量 计算机 基础

大数据技术思想入门(四):分布式文件的元数据是怎么存储的

cristal

Java 大数据 hadoop 分布式

不想做经理的程序员

escray

学习 面试

Redis 之父关于 CRC64 的神秘往事!

yes

redis CRC

图解javascript——基础篇(以思维导图总结js中关键技术点,为面试及工作助力)

执鸢者

Java 大前端

战斗还是逃避,或许可以考虑一下合作?

escray

学习 面试

【解Bug之路】——Nginx 502 Bad Gateway

简爱W

前端分页组件实现逻辑

书旅

php 大前端 分页

week 11

Geek_2e7dd7

让理性思维走进我们的生活,帮助我们做出更好的决策。

叶小鍵

心理学 基思. 斯坦诺维奇 超越智商 认知科学

请不要随便修改基类

架构师修行之路

Netty之旅二:口口相传的高性能Netty到底是什么?

一枝花算不算浪漫

Linux系统监控工具推荐

wangkx

监控 工具软件

视频码控:CBR、VBR和ABR

潇湘落木

直播 SRS 视频编码 码控

介绍一款API敏捷开发工具

棒锤🐮

敏捷开发 Rocket API API敏捷开发

融云 X- Meetup 技术沙龙广州站:全球通信云技术实践分享

InfoQ_967a83c6d0d7

week 11学习总结

Geek_2e7dd7

「零代码」搭建简易招聘管理系统

Tony Wu

效率工具 SaaS 招聘管理 HRIS

数据库是咋工作的?

简爱W

SQL查询语句执行顺序详解

书旅

MySQL SQL语法 sql查询

Docker搭建项目环境实战

书旅

Docker Dockerfile Docker-compose

完了,这个硬件成精了,它竟然绕过了 CPU

简爱W

Flink水位线和时间戳理解-7

小知识点

scala 大数据 flink 模块化流程

POI 之 策略游戏

zhoo299

随笔杂谈

一个快捷方便的油煎鸡胸肉,懒人标配香喷喷好吃看得见

小霸王其乐无穷

美食 鸡胸肉 懒人

Postman生成接口文档

书旅

Postman 接口文档

你可能需要一个脱机状态

非著名程序员

学习 程序员 个人成长 工作方式

Docker 最常用的镜像命令和容器命令

哈喽沃德先生

Docker 容器 微服务

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