JSON的三种处理方式
Jackson提供了三种可选的JSON处理方法(一种方式及其两个变型):
-
流式 API:(也称为"增量分析/生成") 读取和写入 JSON 内容作为离散事件。
-
org.codehaus.jackson.JsonParser 读, org.codehaus.jackson.JsonGenerator 写。
-
StAX API 的激励。
-
-
树模型 :提供一个 JSON 文档可变内存树的表示形式。
-
org.codehaus.jackson.map.ObjectMapper 生成树 ;树组成 JsonNode 节点集。
- 树模型类似于 XML DOM。
-
-
数据绑定: JSON和POJO相互转换,基于属性访问器规约或注解。
-
有 两种变体: 简单 和 完整 的数据绑定:
-
简单数据绑定: 是指从Java Map、List、String、Numbers、Boolean和空值进行转换
-
完整数据绑定 :是指从任何 Java bean 类型 (及上文所述的"简单"类型) 进行转换
-
org.codehaus.jackson.map.ObjectMapper 对两个变种,进行编组(marshalling )处理 (写入 JSON) 和反编组(unmarshalling ,读 JSON)。
-
JAXB激励下的基于注释的 (代码优先)变种。
-
从使用的角度来看,总结这些3 种方法的用法如下:
额,直接贴出所有代码吧,该说的都在代码中了
package com.wujintao.json;
import java.io.IOException;
import java.util.Date;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectReader;
import org.codehaus.jackson.map.ObjectWriter;
import org.junit.Test;
/**
* http://wiki.fasterxml.com/JacksonDownload
* http://wiki.fasterxml.com/JacksonInFiveMinutes
* http://wiki.fasterxml.com/JacksonBestPracticesPerformance
* http://jackson.codehaus.org/1.8.8/javadoc/index.html
* http://wiki.fasterxml.com/ObjectReader
* https://github.com/FasterXML/jackson-docs/wiki/ObjectWriter
* jars:jackson-core-lgpl-1.8.10.jar,jackson-mapper-lgpl-1.8.10.jar
*
* 1.实践结果,无论是哪种形式的转换,Jackson > Gson > Json-lib。Jackson的处理能力甚至高出Json-lib有10倍左右
* 2.JSON-lib似乎已经停止更新,最新的版本也是基于JDK15,而Jackson的社区则较为活跃
* 3.高并发情况下jackson表现尤为优越,内存占用甚少,json-lib会占用很多内存
*
*/
public class TestCase {
@Test
public void test() throws JsonGenerationException, JsonMappingException,
IOException {
long start = new Date().getTime();
ObjectMapper mm = new ObjectMapper(); // can reuse, share
Person pp = new Person();
pp.setAdd("beijing");
pp.setAge(11);
pp.setSalary(1.1);
pp.setSex('男');
String jj = mm.writeValueAsString(pp);
System.out.println(jj);
Person pp2 = mm.readValue(jj, Person.class);
System.out.println(pp2);
long end = new Date().getTime();
System.out.println("using ObjectMapper cost:"+(end-start)+"ms");
System.out.println("=================================");
// 7. Prefer ObjectReader/ObjectWriter over ObjectMapper
// Although the main reason to prefer these objects is thread-safety
// (and thus correctness),there may be performance benefits as well
// 8.When reading a root-level sequence of POJOs,
// readValues() method of ObjectReader can be much more efficient
// than doing explicit iteration using ObjectMapper.readValue() method.
long start2 = new Date().getTime();
ObjectMapper mapper = new ObjectMapper();
Person person = new Person();
person.setAdd("beijing");
person.setAge(11);
person.setSalary(1.1);
person.setSex('男');
ObjectWriter writer = mapper.viewWriter(Person.class);
String json = writer.writeValueAsString(person);
System.out.println(json);
// we'll be reading instances of MyBean
ObjectReader reader = mapper.reader(Person.class);
// and then do other configuration, if any, and read:
Person result = reader.readValue(json);
System.out.println(result);
long end2 = new Date().getTime();
System.out.println("using ObjectReader/ObjectWriter cost:"+(end2-start2)+"ms");
//官网建议使用ObjectReader/ObjectWriter
}
//还有fast-json、Genson 等没做研究
}