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