json转化过慢的调优

博客内容讲述了作者在系统响应变慢后,发现问题是由于Java对象转化为JSON对象过程缓慢。作者通过比较Jackson、Noggit和Gson库的性能,发现Jackson表现最好。然而,当对象存在循环引用时,Gson抛出异常。文章提供了测试代码和链接,并讨论了解决循环引用的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

json转化过慢的调优

最近系统响应很慢,后来发现和SQL也关系不大。
跟踪程序后发现,和JAVA对象转化为JSON对象有一定的关系,也算是优化的一个方面吧。

json的官方网站
http://json.org/

找到一个遇到类似问题的朋友,参考他的日志
http://hi.baidu.com/camaro/blog/item/384b31e9e7bae237b90e2d44.html
http://twit88.com/blog/2008/07/11/java-json-parser-performance/
My test is simple.
Create a JSON object
Add few String objects to the object
Serialize and deserialize the JSON object
Loop the above for 1 million times

The performance of the above libraries sorted in order
Jackson
Noggit
JSON-lib
我使用的也是JSON-lib,NND,测试一下排名前面的两个东东试试。

jackson首页
http://jackson.codehaus.org/
下载地址
http://wiki.fasterxml.com/JacksonDownload
文档地址
http://wiki.fasterxml.com/JacksonInFiveMinutes

下载到jar jackson-xc-1.2.0.jar,jackson-core-asl-1.2.0.jar,jackson-mapper-asl-1.2.0.jar,jackson-jaxrs-1.2.0.jar

User user = new User();
user.setEmail("luohuazju@hotmail.com");
user.setIdxNum(Integer.valueOf(1));
user.setLoginId("luohuazju");
Company u = new Company();
u.setName("handsome");
u.setLocation("四u24029 ");
user.setCompany(u);
Map item = new HashMap();
item.put("user", user);
JSONObject jo = JSONObject.fromObject(item, configJson());
System.out.println("=============json lib====================");
System.out.println(jo.toString());
System.out.println("=============json lib====================");
System.out.println("=============jackson lib====================");
System.out.println(getJsonString(item));
System.out.println("=============jackson lib====================");

private static JsonConfig configJson() {
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
return jsonConfig;
}
private static String getJsonString(Object item) {
JsonFactory jf = new JsonFactory();
try {
StringWriter sw = new StringWriter();
JsonGenerator gen = jf.createJsonGenerator(sw);
new ObjectMapper().writeValue(gen, item);
gen.flush();
return sw.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
单元测试,没有问题,但是在实际的UserController中,user中有company对象,company中有users对象。导致了如下错误:
报错:
DEBUG DispatcherServlet - Could not complete request
Caused by: java.lang.StackOverflowError
at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:71)
at org.codehaus.jackson.map.ser.BeanPropertyWriter$StdMethod.serializeAsField(BeanPropertyWriter.java:215)
at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:58)
at org.codehaus.jackson.map.ser.BeanPropertyWriter$StdMethod.serializeAsField(BeanPropertyWriter.java:215)
at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:58)
搜索到的结果,目前无法解决,要等待1.3版本

noggit的SVN地址
http://svn.apache.org/repos/asf/labs/noggit/
pom.xml注释掉有关eclipse的插件那块
命令 mvn clean
命令 mvn install
编译得到jar包noggit-1.0-SNAPSHOT.jar

玩不来,以后再看看。

gson首页
http://code.google.com/p/google-gson/

代码片段
Gson gson = new Gson();
String json = gson.toJson(item);
System.out.println("=============gson lib====================");
System.out.println(json);
System.out.println("=============gson lib====================");

但是当item中对象有循环引用时报错:
Exception in thread "main" java.lang.IllegalStateException: Circular reference found: cn.sccl.um.model.User@26d4f1
at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:108)

暂时没有找到解决办法,算了,暂时解决对象中的循环调用吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值