Java很快将具有一组标准的API,作为Java EE 7的一部分处理JSON。此标准定义为JSR 353 – JSON处理的Java API (JSON-P),目前正在最终批准投票中。 JSON-P提供面向对象和基于流的方法,在本文中,我将介绍流API。 您可以从下面的链接获取JSON-P参考实现:
- http://java.net/projects/jsonp/
JsonGenerator(javax.json.stream)
JsonGenerator使创建JSON非常容易。 凭借其流畅的API ,用于生成JSON的代码与生成的JSON非常相似。
package blog.jsonp;
import java.util.*;
import javax.json.Json;
import javax.json.stream.*;
public class GeneratorDemo {
public static void main(String[] args) {
Map<String, Object> properties = new HashMap<String, Object>(1);
properties.put(JsonGenerator.PRETTY_PRINTING, true);
JsonGeneratorFactory jgf = Json.createGeneratorFactory(properties);
JsonGenerator jg = jgf.createGenerator(System.out);
jg.writeStartObject() // {
.write("name", "Jane Doe") // "name":"Jane Doe",
.writeStartObject("address") // "address":{
.write("type", 1) // "type":1,
.write("street", "1 A Street") // "street":"1 A Street",
.writeNull("city") // "city":null,
.write("verified", false) // "verified":false
.writeEnd() // },
.writeStartArray("phone-numbers") // "phone-numbers":[
.writeStartObject() // {
.write("number", "555-1111") // "number":"555-1111",
.write("extension", "123") // "extension":"123"
.writeEnd() // },
.writeStartObject() // {
.write("number", "555-2222") // "number":"555-2222",
.writeNull("extension") // "extension":null
.writeEnd() // }
.writeEnd() // ]
.writeEnd() // }
.close();
}
}
输出量
以下是运行GeneratorDemo的输出。
{
"name":"Jane Doe",
"address":{
"type":1,
"street":"1 A Street",
"city":null,
"verified":false
},
"phone-numbers":[
{
"number":"555-1111",
"extension":"123"
},
{
"number":"555-2222",
"extension":null
}
]
}
JsonParser(javax.json.stream)
使用JsonParser,我们将解析上一示例的输出以获取地址信息。 JSON解析器提供与JSON结构相对应的事件的深度优先遍历。 根据事件的类型,可以从JsonParser获得不同的数据。
package blog.jsonp;
import java.io.FileInputStream;
import javax.json.Json;
import javax.json.stream.JsonParser;
import javax.json.stream.JsonParser.Event;
public class ParserDemo {
public static void main(String[] args) throws Exception {
try (FileInputStream json = new FileInputStream("src/blog/jsonp/input.json")) {
JsonParser jr = Json.createParser(json);
Event event = null;
// Advance to "address" key
while(jr.hasNext()) {
event = jr.next();
if(event == Event.KEY_NAME && "address".equals(jr.getString())) {
event = jr.next();
break;
}
}
// Output contents of "address" object
while(event != Event.END_OBJECT) {
switch(event) {
case KEY_NAME: {
System.out.print(jr.getString());
System.out.print(" = ");
break;
}
case VALUE_FALSE: {
System.out.println(false);
break;
}
case VALUE_NULL: {
System.out.println("null");
break;
}
case VALUE_NUMBER: {
if(jr.isIntegralNumber()) {
System.out.println(jr.getInt());
} else {
System.out.println(jr.getBigDecimal());
}
break;
}
case VALUE_STRING: {
System.out.println(jr.getString());
break;
}
case VALUE_TRUE: {
System.out.println(true);
break;
}
default: {
}
}
event = jr.next();
}
}
}
}
输出量
下面是运行ParserDemo的输出。
type = 1
street = 1 A Street
city = null
verified = false
MOXy和JSON处理的Java API(JSR-353)
将JSON映射到域对象仍然是与JSON交互的最简单方法。 现在,JSR-353即将完成,我们将其集成到MOXy的JSON绑定中。 您可以使用以下链接跟踪我们的进度:
- 错误405161 – MOXy支持Java API进行JSON处理(JSR-353)
参考: 用于JSON处理的Java API(JSR-353)– Java XML和JSON绑定博客中来自我们JCG合作伙伴 Blaise Doughan的流API 。
翻译自: https://www.javacodegeeks.com/2013/04/java-api-for-json-processing-jsr-353-stream-apis.html