json序列化工具性能对比

[b]json序列化工具性能对比[/b]


[b]fastjson[/b]
1.fastjson是阿里做的国有开源Java工具包
2.FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。

[b]jackson[/b]
1.Jackson是一个数据处理的工具套件,它的亮点是流式的JSON解析器及生成器。它是专为Java设计的,同时也能处理其它非JSON的编码。
2.从我们在Github中的统计来看,它应该是最流行的JSON解析器。
3.Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。
4.Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式

[b]JSON.simple[/b]
JSON.simple是一个JSON编解码的Java工具库。它旨在打造一个轻量简单且高性能的工具库。

[b]GSON[/b]
1.Google的GSON
2.GSON这个Java库能够在Java对象和JSON间进行相互转换。
3.Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。

[b]JSONP[/b]
1.Oracle的JSONP
2.JSONP (JSON Processing)是JSON处理的一套Java API,从名字来看它就是用来生成及解析JSON串的。这是JSR353规范的一个开源实现。


[b]总结[/b]
1.如果你的应用经常会处理大的JSON文件(190MB),那么Jackson应该是你的菜。GSON在大文件上表现得相当吃力。
2.如果你主要是处理小文件(1K)请求,比如某个微服务或者分布式架构的初始化,那么GSON当是首选。Jackson在小文件上的表现则不如人意。
3.如果这两种文件你都经常会处理到,那么在两轮表现中都位居第二的JSON.simple对此类场景则更为适合。在不同的文件大小上Jackson和GSON的表现都不太好。
4.如果只是功能要求,没有性能要求,可以使用google的Gson
5.如果有性能上面的要求可以使用Gson将bean转换json确保数据的正确,使用FastJson将Json转换Bean
6.GSON如果不是每次产生新对象时,是最快的

结论:
1.在做了初始化的情况下GSON的速度都是最快的。
2.在使用GSON或jackJson做Json处理时最好有个全局的解析对象,不要每次调用的时候都去生成那样对性能的影响很大,另外经过测试,这里面没有线程安全问题。
3.fastJson在json转化为对象的应用场景下性能比较突出


[b]实测对比:[/b]
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
</dependency>



package com.cesmart;

import java.util.List;

class Demo {
private String cmd;
private String content;
private List<User> userList;

public static class User{
private int age;
private String name;
private int year;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}

}

public String getCmd() {
return cmd;
}

public void setCmd(String cmd) {
this.cmd = cmd;
}

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
}

public List<User> getUserList() {
return userList;
}

public void setUserList(List<User> userList) {
this.userList = userList;
}

}


[b]每次新建对象:[/b]
package com.cesmart;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.cesmart.Demo.User;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;

public class Application {
private static long count = 100;

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
long gsonTime = gson();
System.gc();
long jackJsonTime = jackJson();
System.gc();
long fastJsonTime = fastJson();
System.gc();
System.out.println("---------------------------------------------------------------");
long gsonTime2 = gsonJson();
System.gc();
long jackJsonTime2 = jackJsonJson();
System.gc();
long fastJsonTime2 = fastJsonJson();

System.out.println("---------------------------------------------------------------");
System.out.println("object to json: " + "gsonTime == " + gsonTime);
System.out.println("object to json: " + "jackJsonTime == " + jackJsonTime);
System.out.println("object to json: " + "fastJsonTime == " + fastJsonTime);
System.out.println("---------------------------------------------------------------");
System.out.println("json to object: " + "gsonTime == " + gsonTime2);
System.out.println("json to object: " + "jackJsonTime == " + jackJsonTime2);
System.out.println("json to object: " + "fastJsonTime == " + fastJsonTime2);
}

private static Demo getDemo(int i) {
Demo demo = new Demo();

List<User> userList = new ArrayList<User>();

User user1 = new User();
user1.setAge(i);
user1.setName("name");
user1.setYear(i);

User user2 = new User();
user2.setAge(i + 2);
user2.setName("name");
user2.setYear(i + 2);

User user3 = new User();
user3.setAge(i + 3);
user3.setName("name");
user3.setYear(i + 3);

userList.add(user1);
userList.add(user2);
userList.add(user3);

demo.setCmd("1");
demo.setContent("dd");
demo.setUserList(userList);

return demo;
}

private static long gson() {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
Gson gson = new Gson();
String StringJson = gson.toJson(demo);
System.out.println(StringJson);
}
long endTime2 = System.currentTimeMillis();
System.out.println("gson--obj--json:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}

private static long jackJson() throws Exception {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
ObjectMapper objectMapper = new ObjectMapper();
String StringJson = objectMapper.writeValueAsString(demo);
System.out.println(StringJson);
}
long endTime2 = System.currentTimeMillis();
System.out.println("jackJson--obj--json:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}

private static long fastJson() {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
// JSONObject jsonObject = new JSONObject();
String StringJson = JSON.toJSONString(demo);
System.out.println(StringJson);
}
long endTime2 = System.currentTimeMillis();
System.out.println("fastJson--obj--json:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}

private static long gsonJson() {
long endTime1 = System.currentTimeMillis();

for (int i = 0; i < count; i++) {
Gson gson = new Gson();
Demo demo = getDemo(i);
String StringJson = JSON.toJSONString(demo);

gson.fromJson(StringJson, Demo.class);
}
long endTime2 = System.currentTimeMillis();
System.out.println("gson--json--obj:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}

private static long jackJsonJson() throws Exception {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
ObjectMapper objectMapper = new ObjectMapper();
Demo demo = getDemo(i);
String StringJson = JSON.toJSONString(demo);

objectMapper.readValue(StringJson, Demo.class);
}
long endTime2 = System.currentTimeMillis();
System.out.println("jackJson--json--obj:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}

private static long fastJsonJson() {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
String StringJson = JSON.toJSONString(demo);

JSON.parseObject(StringJson, Demo.class);
}
long endTime2 = System.currentTimeMillis();
System.out.println("fastJson--json--obj:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}

}


[b]输出结果:[/b]
[img]http://dl2.iteye.com/upload/attachment/0121/3789/097cb84b-9f63-3951-800e-8dc9a5ba706c.png[/img]

[b]初始化时新建对象:[/b]
package com.cesmart;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.cesmart.Demo.User;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;

public class Application2 {
private static ObjectMapper objectMapper = new ObjectMapper();

private static Gson gson = new Gson();

private static JSONObject jsonObject = new JSONObject();

private static long count = 100;

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
long gsonTime = gson();
System.gc();
long jackJsonTime = jackJson();
System.gc();
long fastJsonTime = fastJson();
System.gc();
System.out.println("---------------------------------------------------------------");
long gsonTime2 = gsonJson();
System.gc();
long jackJsonTime2 = jackJsonJson();
System.gc();
long fastJsonTime2 = fastJsonJson();

System.out.println("---------------------------------------------------------------");
System.out.println("object to json: " + "gsonTime == " + gsonTime);
System.out.println("object to json: " + "jackJsonTime == " + jackJsonTime);
System.out.println("object to json: " + "fastJsonTime == " + fastJsonTime);
System.out.println("---------------------------------------------------------------");
System.out.println("json to object: " + "gsonTime == " + gsonTime2);
System.out.println("json to object: " + "jackJsonTime == " + jackJsonTime2);
System.out.println("json to object: " + "fastJsonTime == " + fastJsonTime2);

}

private static Demo getDemo(int i) {
Demo demo = new Demo();

List<User> userList = new ArrayList<User>();

User user1 = new User();
user1.setAge(i);
user1.setName("name");
user1.setYear(i);

User user2 = new User();
user2.setAge(i + 2);
user2.setName("name");
user2.setYear(i + 2);

User user3 = new User();
user3.setAge(i + 3);
user3.setName("name");
user3.setYear(i + 3);

userList.add(user1);
userList.add(user2);
userList.add(user3);

demo.setCmd("1");
demo.setContent("dd");
demo.setUserList(userList);

return demo;
}

private static long gson() {
long endTime1 = System.currentTimeMillis();

for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);

String StringJson = gson.toJson(demo);
System.out.println(StringJson);
}
long endTime2 = System.currentTimeMillis();
System.out.println("gson--obj--json:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}

private static long jackJson() throws Exception {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);

String StringJson = objectMapper.writeValueAsString(demo);
System.out.println(StringJson);
}
long endTime2 = System.currentTimeMillis();
System.out.println("jackJson--obj--json:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}

private static long fastJson() {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
String StringJson = JSON.toJSONString(demo);
System.out.println(StringJson);
}
long endTime2 = System.currentTimeMillis();
System.out.println("fastJson--obj--json:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}

private static long gsonJson() {
long endTime1 = System.currentTimeMillis();

for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
String StringJson = JSON.toJSONString(demo);

gson.fromJson(StringJson, Demo.class);
}
long endTime2 = System.currentTimeMillis();
System.out.println("gson--json--obj:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}

private static long jackJsonJson() throws Exception {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
String StringJson = JSON.toJSONString(demo);

objectMapper.readValue(StringJson, Demo.class);
}
long endTime2 = System.currentTimeMillis();
System.out.println("jackJson--json--obj:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}

private static long fastJsonJson() {
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Demo demo = getDemo(i);
String StringJson = JSON.toJSONString(demo);

JSON.parseObject(StringJson, Demo.class);
}
long endTime2 = System.currentTimeMillis();
System.out.println("fastJson--json--obj:" + (count * 1000) / (endTime2 - endTime1) + "次/s" + " use time == "
+ (endTime2 - endTime1) + "ms");
return endTime2 - endTime1;
}

}

输出结果:
[img]http://dl2.iteye.com/upload/attachment/0121/3791/cc049690-0f72-3d75-abd7-d9b4a5cb6ebd.png[/img]


参考原文:[url]http://blog.csdn.net/accountwcx/article/details/50252657[/url]
参考原文:[url]http://www.open-open.com/lib/view/open1434377191317.html[/url]
参考原文:[url]http://www.oschina.net/code/snippet_1156226_26432[/url]
参考原文:[url]http://chenyanxi.blog.51cto.com/4599355/1543445[/url]
参考原文(GSON最快的实现):[url]http://chenyanxi.blog.51cto.com/4599355/1543445[/url]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值