Jackson也被称为JSON for Java,已经成为事实上的JSON数据处理的标准实现。
Jackson提供了一组工具,用以处理JSON数据,当前最新版本为28-Mar-2018发布的2.9.5。
Jackson的标准设计思路是首先构造JsonFactory对象,然后生成JsonParser对象以读取JSON数据并转换为Java对象,或者生成JsonGenerator对象以将Java对象转换为JSON数据并写入文件等。
除此之外,Jackson的data-binding机制还提供了更灵活的ObjectMapper对象,能够方便地在JSON数据与Java对象之间进行映射。ObjectMapper对象的主要方法如下:
- readValue(sourceData, targetClass.class)
- writeValue(new File("result.json"), mySourceObject);
- writeValueAsString(mySourceObject);
Jackson的jackson-annotations暂不在这里进行讨论。
1. 将JSON数据转换为Java对象,利用JsonParser
1) 方法一:JsonParser解析数据流(推荐)
JsonFactory factory = new JsonFactory();
JsonParser jp = jsonFactory.createJsonParser(read_source_file); // or URL, Stream, Reader, String, byte[]
if (jp.nextToken() != JsonToken.START_OBJECT) {
throw new IOException(...);
}
while(jp.nextToken() != JsonToken.END_OBJECT){
String fieldName = jp.getCurrentName();
if (...){...}
jp.nextToken();
}
jp.close();
2) 方法二:使用ObjectMapper将JSON数据构造一个完整的JsonNode树状结构,然后遍历查找
String strJsonData = IOUtils.toString(new URL(eris_url));
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(strJsonData);
JsonParser jp = node.traverse();
...
3) 方法三:使用ObjectMapper进行DataBind直接将JSON数据映射为Java POJO对象
ObjectMapper mapper = new ObjectMapper();
MyMap infoMap = mapper.readValue(strJsonContent, MyMap.class);
2. 读取Java对象生成JSON格式的数据
这往往是通过将各种Java对象转换为JsonGenerator对象而实现的。
1) Java POJO对象->JsonGenerator
JsonFactory jsonFactory = new JsonFactory();
JsonGenerator jg = jsonFactory.createJsonGenerator(new_writable_file, JsonEncoding.UTF8); // or Stream, Reader
jg.writeStartObject();
jg.writeNumberField(mySourceObject.getMyField(...));
...
jg.writeEndObject();
jg.close();
2) JSON数据流->JsonGenerator
ObjectMapper mapper = new ObjectMapper();
...
mapper.writeValue(jg, javaObject);
3) JsonNode树状结构对象->JsonGenerator
JsonNodeFactory factory = new JsonNodeFactory(false);
JsonNode nodeSource = factory.objectNode();
JsonFactory jsonFactory = new JsonFactory();
JsonGenerator jgTarget = jsonFactory.createGenerator(System.out);
ObjectMapper mapper = new ObjectMapper();
mapper.writeTree(jgTarget, nodeSource);
关于Jackson的初步介绍,请参考JSON及其Java处理器Gson和Jackson入门详解。
参考链接:
https://github.com/FasterXML/jackson
https://github.com/FasterXML/jackson-core
https://github.com/FasterXML/jackson-databind
https://github.com/FasterXML/jackson-annotations
https://github.com/FasterXML/jackson-docs
https://github.com/FasterXML/jackson-docs/wiki/Finding-Javadoc