NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

关注

评论

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

SpringBoot 实战:优雅的使用枚举参数(原理篇)

看山

Java Spring Boot Effective Spring 10月月更

业务中台数据一致性方案

慕枫技术笔记

后端 引航计划

Ember Data 之记录操作:创建、更新和删除

devpoint

store ember.js 10月月更

架构实战营模块九作业-毕业设计

子豪sirius

架构实战营

stm32-HAL使用usart发送中断判断发送标志库问题

良知犹存

stm32

微博评论高性能高可用计算架构

白开水又一杯

#架构实战营

模块9

脉动

在开源项目或工作项目中使用git建立fork仓库

良知犹存

git

stm32-HAL使用stop模式后DMA初始化的问题

良知犹存

stm32

技术公众号小白互助网络

Felix

GitHub 微信公众号 自媒体

OpenCV学习(二):环境搭建

轻口味

OpenCV图像处理 10月月更

别被vector最后一个元素erase错误

良知犹存

c++

Linux开发coredump文件分析实战分享

良知犹存

Linux

5款良心工具,专治各种流氓顽固软件!

Jackpop

Android使用adb工具及root权限完成手机抓包

杨清强

adb

产品经理如何采集需求?

石云升

产品经理 需求分析 10月月更

模块九作业:设计电商秒杀系统

Felix

【SpringCloud技术专题】「Hystrix源码」分析故障切换的运作流程

洛神灬殇

源码分析 SpringCloud Hystrix 熔断器 10月月更

如何进行用户故事估算——Ethan分享观后感

Bruce Talk

敏捷 随笔 Agile User Story Product Owner

半年时间,拍摄8省市10个案例,我们见到了这样的智能中国

脑极体

设计千万级学生管理系统的考试试卷存储方案

Rabbit

架构实战营 - 模块九作业

思梦乐

012云原生之微服务

穿过生命散发芬芳

云原生 10月月更

马拉车算法,其实并不难!!!

秦怀杂货店

数据结构 算法 LeetCode

敬畏用户

FunTester

软件测试 测试 用户 FunTester 用户思维

10. python入门速通教程之类、继承类、类中的特殊方法

梦想橡皮擦

10月月更

容器 & 服务:Kubernetes API Server访问问题

程序员架构进阶

架构 Kubernetes 容器 Helm Charts 10月月更

一文带你盘点“微服务”中的技术点

Simon郎

微服务 Spring Cloud spring cloud alibaba java

模块九毕业设计

以吻封笺

数据库优化之explain 的使用和常用的SQL优化或索引优化

Regan Yue

数据库 数据库优化 Regan Yue 10月月更

MacBook的隐藏功能

IT蜗壳-Tango

10月月更

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