[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) {
			 = 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]