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" keywhile(jr.hasNext()) {event = jr.next();if(event == Event.KEY_NAME && "address".equals(jr.getString())) {event = jr.next();break;}}// Output contents of "address" objectwhile(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