文档章节

Jackson优化使用实例

白志华
 白志华
发布于 2015/10/18 10:55
字数 690
阅读 20
收藏 0

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/xiaoxian8023/article/details/42305449

共有 人打赏支持
白志华
粉丝 29
博文 265
码字总数 57524
作品 0
长沙
程序员
Jackson工具类使用及配置指南、高性能配置(转)

Jackson使用工具类 通常,我们对JSON格式的数据,只会进行解析和封装两种,也就是以及。 public class JsonUtils { Logger for this class } 将json string反序列化成对象 @param json @par...

easonjim
02/16
0
0
kafka学习(四)---- Kafka整合SpringMVC实例(二)

目前没有很好的整合Kafka的案例,自己参考着使用spring-integration-kafka框架写了一个:Kafka整合SpringMVC实例,但同时也发现官方文档也不全,所以又用spring简单的实现了一下,感觉这个比...

火龙战士
2016/08/23
2.7K
13
Fastjson和Jackson序列化和读取json的性能实测

偶然间看到的阿里出品的Fastjson,网上对这个json包好评如潮,性能胜Jackson10倍。 本人本着眼见为实的想法,自己测试一下两者的性能比较。 POJO对象名字为User,具体代码就不贴了,里面有两...

derekxyz
2014/04/24
0
0
kafka学习(三)----- Kafka整合SpringMVC实例

kafka一个高吞吐量的分布式发布订阅消息系统。有关知识请参看:kafka基本概念以及环境搭建,kafka整合springMVC需要用到一个开源框架:spring-integration-kafka,这个官方框架我就不介绍了,...

火龙战士
2016/08/22
2.2K
0
Spring3 MVC 笔记(二) —json+rest优化

接上次的 spring mvc 注解的一些详细信息! 其实也是一些个人的学习笔记 呵呵! http://7454103.iteye.com/blog/716975 有了上面的基础! 一起来研究些其他的东西! 前端时间写了个 struts2 ...

李长春
2011/09/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

no such module 'pop'问题

在github上 clone 了一个 swift 项目,编译时提示"no such module 'POP'"错误,查了一下居然是因为podfile中指定的最低版本是iOS 11.0,大于我测试手机的iOS版本10.3.3,将Podfile中的最低版...

yoyoso
50分钟前
1
0
redis 系列一 -- 简介及安装

1.简介 redis -- remote dictionary server 远程字典服务 使用 C 语言编写; 高性能的 key-value数据库; 内存数据库,支持数据持久化。 Redis 是一个开源(BSD许可)的,内存中的数据结构存...

imbiao
今天
3
0
nginx log记录请求响应时间

有时为了方便分析接口性能等,需要记录请求的时长,通过修改nginx的日志格式可以做到,如 添加一个新的log_format log_format timed_combined '$remote_addr - $remote_user [$time_local] "...

swingcoder
今天
4
0
Spring MVC之RequestMappingHandlerMapping匹配

对于RequestMappingHandlerMapping,使用Spring的同学基本都不会陌生,该类的作用有两个: 通过request查找对应的HandlerMethod,即当前request具体是由Controller中的哪个方法进行处理; 查...

爱宝贝丶
今天
3
0
Java Web--增删改查之二界面后台java代码(转载参考)

/** *  *//** * @author Administrator * */package dao; import java.sql.*;public class DBConn {/** * 链接数据库 * @return */  ...

小橙子的曼曼
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部