JSR 374(JSON-P 1.1 版本)的公开预览版现在已经开放,JSON-P 是一个针对处理 JSON 的 Java API。这个版本有望和 JSON 绑定库(JSON-B)的 Java API 一同被添加到 Java EE 8 的发布版本中,并且它还保持了 JSON-P 当前所支持的 JSON IETF标准。它提供了如下支持:
- JSON Pointer
- JSON Patch
- JSON Merge Patch
- 查询和转换操作
- Java 8 流以及 lambda 表达式
在 2013 年,JSON-P 作为 Gson 和 Jackson 的替代方案,被引入到 J2EE 7 的发布版本中。它被设计用于解析、生成和查询标准的 JSON 文档。
JSR-367 是 JSON 绑定库的 Java API,它也被纳入了 Java EE 8 的发布版本中。JSON-B 被设计用来将 JSON 与 Java 中的对象绑定起来。InfoQ 对之前 JSON-B 公开预览版的发布也有过报道。
入门指南
我们先从 JSON-P 的解析器(Parser)和指针(Pointer)的一个例子开始入门,考虑如下的 JSON 文档:
[ { "publication":"New Vaadin Spring Release Introduces Enhanced View Management", "publicationDate":"2016-12-30 00:00:00", "author":"Michael Redlich", "publicationType":"Article", "publisher":"C4Media" }, { "publication":"Pivotal Releases First Milestone of Next-Generation Spring Data Featuring Reactive Database Access", "publicationDate":"2017-01-19 00:00:00", "author":"Michael Redlich", "publicationType":"Article", "publisher":"C4Media" }, { "publication":"Netflix Introduces Hollow, a Java Library for Processing In-Memory Datasets", "publicationDate":"2017-01-31 00:00:00", "author":"Michael Redlich", "publicationType":"Article", "publisher":"C4Media" } ]
这个 JSON 文档可以使用JsonParser
进行解析:
InputStream fis = new FileInputStream(JSON_FILE); JsonParser parser = Json.createParser(fis); while(parser.hasNext()) { JsonParser.Event event = parser.next(); switch(event) { case START_ARRAY: case END_ARRAY: case START_OBJECT: case END_OBJECT: case VALUE_FALSE: case VALUE_NULL: case VALUE_TRUE: System.out.println(event.toString()); break; case KEY_NAME: System.out.print(event.toString() + " " + parser.getString() + " - "); break; case VALUE_STRING: case VALUE_NUMBER: System.out.println(event.toString() + " " + parser.getString()); break; } } fis.close();
通过使用JsonPointer
,我们能够找到 JSON 文档中的特定元素:
InputStream fis = new FileInputStream(JSON_FILE); JsonReader jsonReader = Json.createReader(fis); JsonArray jsonArray = jsonReader.readArray(); JsonPointer pointer = Json.createPointer("/1/publication"); JsonValue publication = pointer.getValue(jsonArray); System.out.println(i + ": " + publication); fis.close();
这个例子中找到并且显示出了上述 JSON 文档中的第二个 publication。我们在 GitHub 上准备了一个完备的实例程序,其中包括 JSON-P、Gson 以及 Jackson。
最新的 JSON-P 1.1规格书能够在 JSR-374 网站上下载到。
大名鼎鼎的Java EE 传播者 Reza Rahman 最近发布了一篇博客,他在其中阐述了 JSON 在 Java EE 8 中起到的作用:
这两个 API 对于加强 JSON 在 Java 中的地位至关重要,就像 JAXP(处理 XML 的 Java API)和 JAXB(XML 绑定库的 Java API)在许多年前所起的作用一样。通过这两个 API,Java 开发者可以简单地将 JSON 视为另一种 Java 序列化格式。不需要过多的第三方库和配置了:JSON 处理变得极其简单。在我看来,这些 API 非常关键,它们应该被纳入一个模块化的 Java SE 版本中,就像是 JAXB 和 JAXP 已经成为了 Java SE 中的一部分一样。
JSON-P 和 JSON-B 的最终版本有望在 2017 年 4 月发布。
其它资源
关于 JSON-P 的其它更多信息请访问如下资源:
- Dmitry Kornilov 和 Werner Keil 的报告: Java EE 8 中对于 JSON 的支持
- Dmitry Kornilov 的报告:通过 JSR 决议
- Jitendra Kotamraju 的文章:针对 JSON 处理的 Java API:JSON 简介
- 网站 JSR 353:针对 JSON 处理的 Java API:参考实现
- Oracle 的指南: 19.3 章:使用对象模型 API
查看英文原文: Public Review of JSON-P Specification 1.1 is Now Open
感谢薛命灯对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论