Jackson优化使用实例

简介: JSON的三种处理方式  Jackson提供了三种可选的JSON处理方法(一种方式及其两个变型): 流式 API:(也称为"增量分析/生成") 读取和写入 JSON 内容作为离散事件。

JSON的三种处理方式 
Jackson提供了三种可选的JSON处理方法(一种方式及其两个变型):

  • 流式 API(也称为"增量分析/生成") 读取和写入 JSON 内容作为离散事件。

  • 树模型 :提供一个 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 种方法的用法如下:

  • 流 API: 性能最佳的方式 (最低开销、 速度最快的读/写; 其它二者基于它实现)。

  • 数据绑定 :使用最方便的方式。

  • 树模型: 最灵活的方式。

 

额,直接贴出所有代码吧,该说的都在代码中了:

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 等没做研究
}


目录
相关文章
|
7月前
|
JSON 安全 Java
jackson学习之二:jackson-core
了解jackson最底层的功能逻辑
120 0
jackson学习之二:jackson-core
MapStruct - 生成空对象解决方案
MapStruct - 生成空对象解决方案
811 0
|
7月前
|
XML JSON Java
jackson学习之一:基本信息
对jackson有个基本了解
jackson学习之一:基本信息
|
11月前
|
缓存 NoSQL Java
最详细 | redis实战:JackSon/FastJson方式序列化深度解析
Jackson2JsonRedisSerializer和FastJsonRedisSerializer的实战应用
2165 0
性能高、上手快,实体类转换工具 MapStruct 到底有多强大
1.什么是MapStruct 1.1 JavaBean 的困扰 对于代码中 JavaBean之间的转换, 一直是困扰我很久的事情。在开发的时候我看到业务代码之间有很多的 JavaBean 之间的相互转化, 非常的影响观感,却又不得不存在。我后来想的一个办法就是通过反射,或者自己写很多的转换器。 第一种通过反射的方法确实比较方便,但是现在无论是 BeanUtils, BeanCopier 等在使用反射的时候都会影响到性能。虽然我们可以进行反射信息的缓存来提高性能。但是像这种的话,需要类型和名称都一样才会进行映射,有很多时候,由于不同的团队之间使用的名词不一样,还是需要很多的手动 set/get
|
JSON 前端开发 数据格式
Jackson动态扩展自定义字段
在日常开发中,会有些字段经常发生变化的类,但是每次都要修改数据传输类,例如前端需要额外新增一个 参数响应,或者业务上需要调整某些动态的字段等等,那如何解决此类问题呢。
366 0
Jackson动态扩展自定义字段
|
JSON Java fastjson
Springboot 使用Jackson 操作 json数据,各场景实例
Springboot 使用Jackson 操作 json数据,各场景实例
814 0
Springboot 使用Jackson 操作 json数据,各场景实例
|
JSON 安全 IDE
用了几年的 Fastjson,我最终替换成了Jackson!
为什么要替换fastjson 工程里大量使用了fastjson作为序列化和反序列化框架,甚至ORM在处理部分字段也依赖fastjson进行序列化和反序列化。那么作为大量使用的基础框架,为什么还要进行替换呢?
1361 0
用了几年的 Fastjson,我最终替换成了Jackson!
|
存储 Java 数据库
设置Springboot返回jackson数据序列化
设置Springboot返回jackson数据序列化
368 0