`
id.alex
  • 浏览: 22967 次
社区版块
存档分类
最新评论

比较 fastjson gson.

    博客分类:
  • Java
阅读更多
一个简单的 Model .
public class Model {
	public int i = 0;
	public double d = 0.1;
	public String s = "s";
}


fastjson
如果要 json 化的对象是一个自定义类型的对象.
利用 com.alibaba.dubbo.common.bytecode 里面的工具类,

引用

Wrapper com.alibaba.dubbo.common.bytecode.Wrapper.makeWrapper(Class<?> c)


生成 Model 类的一个 Wrapper 类, Wrapper 类是一个利用 javassist 动态生产的一个包装工具类.比如  Model 类的 Wrapper 类里的方法有:
public Object getPropertyValue(Object o, String n) {
		org.alex.cases.json.compare.Model w;
		try {
			w = ((org.alex.cases.json.compare.Model) $1);
		} catch (Throwable e) {
			throw new IllegalArgumentException(e);
		}
		if ($2.equals("i")) {
			return ($w) w.i;
		}
		if ($2.equals("d")) {
			return ($w) w.d;
		}
		if ($2.equals("s")) {
			return ($w) w.s;
		}
		throw new com.alibaba.dubbo.common.bytecode.NoSuchPropertyException("Not found property \"" + $2
				+ "\" filed or setter method in class org.alex.cases.json.compare.Model.");
	}

	public void setPropertyValue(Object o, String n, Object v) {
		org.alex.cases.json.compare.Model w;
		try {
			w = ((org.alex.cases.json.compare.Model) $1);
		} catch (Throwable e) {
			throw new IllegalArgumentException(e);
		}
		if ($2.equals("i")) {
			w.i = ((Number) $3).intValue();
			return;
		}
		if ($2.equals("d")) {
			w.d = ((Number) $3).doubleValue();
			return;
		}
		if ($2.equals("s")) {
			w.s = (java.lang.String) $3;
			return;
		}
		throw new com.alibaba.dubbo.common.bytecode.NoSuchPropertyException("Not found property \"" + $2
				+ "\" filed or setter method in class org.alex.cases.json.compare.Model.");
	}

	public Object invokeMethod(Object o, String n, Class[] p, Object[] v) throws java.lang.reflect.InvocationTargetException {
		org.alex.cases.json.compare.Model w;
		try {
			w = ((org.alex.cases.json.compare.Model) $1);
		} catch (Throwable e) {
			throw new IllegalArgumentException(e);
		}
		throw new com.alibaba.dubbo.common.bytecode.NoSuchMethodException("Not found method \"" + $2
				+ "\" in class org.alex.cases.json.compare.Model.");
	}


里面的方法是遍历 Model 类的属性, 字符串拼接出来的.
然后利用一个 ConcurrentHashMap<Class<?>, Wrapper> 关联存储 Model.class() 和这个 Wrapper对象.

然后遍历 Model 各个属性,碰到基本类型或String就按照对应的格式输出, 碰到非基本类型,非 Map 非 Collection 非 Array ,那么再递归进去,再生成一个对应那个属性类型的 Wrapper,直到所有属性都为基本类型为止.
这样就生成了最后的 JSON.

gson

gson 里面有 TypeAdapterFactory  和 TypeAdapter 的概念
TypeAdapterFactory 是N个(大约30多种)类型(TypeAdapter) 的单例Factory,
比如有: 基本类型, Collection, Map, 自定义类(ReflectiveTypeAdapterFactory),URL , ENUM, Calendar 等.

还是以上面的 Model 类为例, Model 类就属于自定义类.
同样利用 TypeAdapterFactory  获取对应的 Model 的 TypeAdapter.
同样,在利用并发的 Map 关联 Map.class 和 对应的 TypeAdapter ,但 gson 的 Map 是用 Collections.synchronizedMap 实现同步的.
TypeAdapter 里面有一个
write(JsonWriter out, T value) 


value 参数就是 Model 类的实际对象. 然后遍历属性写到 Writer out 流中,实际上JsonWriter  就是一个 StringWriter.

然后... StringWriter.toString , json 就出来了.


----------------------------------------------------------------------------------
  • 比较来说, Gson 比 fastjson 考虑更全面, 对用 URL , UUID, BIT_SET, CALENDAR 等等,都有特定的输出规则.
  • 小数量的调用 Gson 比 fastjson 快一点. (几十毫秒,可以毫不在意.猜测是因为 javassist 生成新的 Wrapper 类导致,因为还要编译的.)
  • 大数量的调用 fastjson 比 Gson 快. (千万级别的.还不太确定为什么会变快, 猜测是 gson 的反射调用,毕竟比不上 fastjson Wrapper 类的真实调用.)
  • 代码可阅读性: fastjson  比 Gson 好很多很多.
  • fastjson 在要序列化对象的类型的判断上,使用的是 if else ,
    Gson 使用的是遍历 TypeAdapterFactory集合,在每个 TypeAdapterFactory 里面做判断.而且使用了 N 多的匿名内部类, 想要一眼看出有哪些 TypeAdapterFactory 的实现都很困难.
  • 如果普通日常使用,推荐使用 fastjson,简单易懂,并且是国内程序员开发,有问题可以较容易的获得支持.
  • Gson 有对各种类型的属性支持, 如果有特殊类型json化需求可以选择 gson ,并自定义扩充.
分享到:
评论

相关推荐

    谷歌的Gson.jar和阿里的fastJson.jar

    本文将详细探讨两个流行的Java JSON库:谷歌的Gson.jar和阿里的fastJson.jar,以及它们在处理JSON与Java对象之间转换(特别是与List类型)的方法。 首先,我们来看谷歌的Gson库。Gson是Google提供的一个开源项目,...

    fastjson-1.2.70.rar

    Fastjson相比于Jackson、Gson等其他流行的JSON库,优势在于其更高的性能、更简洁的API以及对Java特性的深度支持。尽管每个库都有其适用场景,但在处理大量数据和需要快速转换时,Fastjson往往能提供更好的解决方案。...

    JSON.jar包,GSON.jar包,FASTJSON.jar包

    JSON.jar、GSON.jar和FASTJSON.jar是三个不同的Java库,它们都提供了处理JSON的API。 1. **JSON.jar**: 这个JAR包可能包含一个基本的JSON解析和生成工具。在Java中,JSON.jar可能提供简单的函数来将Java对象转换为...

    fastjson1.2.9.zip

    与其他如Jackson、Gson等Java JSON库相比,Fastjson在速度上有优势,且API设计更符合中国开发者习惯,对于处理中文字符的支持也更为友好。然而,每个库都有其适用场景,选择时应结合项目需求进行评估。 五、集成与...

    gson jar包下载

    Person deserializedPerson = gson.fromJson(jsonString, Person.class); ``` **二、高级特性** 1. **类型转换** Gson可以处理基本数据类型,如整型、浮点型、字符串,以及自定义的复杂对象。在处理复杂类型时...

    fastjson-1.2.5.jar包

    1. **高性能**:Fastjson在处理大规模JSON数据时表现出优秀的性能,它的解析速度比其他流行的JSON库如Jackson、Gson等更快。 2. **简单易用**:Fastjson的API设计简洁,易于理解和使用。例如,可以使用`JSON....

    fastjson1.2.8 jar包及其源码下载(附带Gson jar包)

    阿里巴巴公司研发的fastjson1.2.8的jar包 以及源码包,是目前开源json解析包中速度最快的工具包,但其在复杂的bean类转json的时候存在一定的问题,所以搭配Gson解析一起。 给各位童鞋一个查找jar包的方式:...

    fastjson2-2.0.39.zip

    3. 性能调优:根据实际需求,可以启用或禁用Fastjson的一些高级特性,如开启Gson兼容模式、禁用自动类型转换等,以达到最佳的性能表现。 总的来说,Fastjson2-2.0.39是Java开发中处理JSON数据的强大工具,它提供了...

    fastjson、gson、jackson序列化和反序列化所用 json

    Gson的主要功能是通过`Gson.toJson()`方法实现对象到JSON的序列化,以及`Gson.fromJson()`方法实现JSON到对象的反序列化。Gson还支持自定义类型转换器,可以满足定制化的需求。 3. **Jackson**:Jackson是由...

    Json解析案例json,fastjson,gson

    Person person = gson.fromJson(jsonString, Person.class); // 序列化 String json = gson.toJson(person); ``` ### 比较与选择 1. **性能**:`fastjson`通常比`gson`更快,但两者在大多数场景下性能差异并不...

    gson fastjson

    3. JSON到Java对象:使用`Gson.fromJson()`方法将JSON字符串转换为Java对象。 ```java Gson gson = new Gson(); MyObject obj = gson.fromJson(jsonString, MyObject.class); ``` 4. Java对象到JSON:使用`Gson...

    gson-fastjson.zip

    本文将深入探讨两个流行的Java JSON库:Fastjson和Gson,以及它们在处理JSON时的关键特性和使用方法。 首先,我们来看`fastjson-1.2.68.jar`,这是阿里巴巴开发的一个高性能的JSON库。Fastjson的特点在于其快速的...

    protostuff fastjson gson 高性能序列化jar包

    `protostuff`、`fastjson`和`gson`就是三个流行的Java序列化库,它们各自具有独特的特性和优势。 首先,让我们详细了解一下这三个库: 1. **protostuff**: - Protostuff是一个非常快速且灵活的序列化框架,它...

    json例子源码

    fastjson gson jackjson json-lib org.json的使用例子 ... import com.google.gson.Gson; import com.google.gson.GsonBuilder;... String prettyJson = gson.toJson(jsonEl); return prettyJson; } }

    fastjson解析器和生成器 v1.2.83.zip

    Fastjson以其优秀的性能著称,它的解析和生成速度通常快于其他同类库,如Jackson和Gson。此外,它还提供了流式处理模式,对于处理大量数据时,可以显著降低内存消耗。 ### 特性与优化 - **类型转换**:Fastjson...

    fastjson gson mysq lojdbc commons-io解析包

    这里提到的"fastjson gson mysql ojdbc commons-io dom4j解析包"包含了几个关键的Java库,它们各自在不同的场景下发挥着重要作用。下面将详细阐述这些库的主要功能和用途。 1. **Fastjson**:由阿里巴巴开发的高...

    FastJson.jar.rar

    1. 高性能:FastJson的解析速度非常快,相比其他同类库如Jackson和Gson,其在大量数据处理时表现出更优秀的性能。 2. 简单易用:API设计简洁,支持多种转换方式,使得代码编写更加直观。 3. 动态类型:FastJson支持...

    FastJsonJar

    然而,值得注意的是,尽管FastJsonJar在性能上表现出色,但在某些特定场景下可能不如其他库如Gson或Jackson稳定,因此在实际使用时,应根据项目需求和具体场景选择合适的JSON库。 总的来说,FastJsonJar作为一款...

    fastjson-1.2.70.jar.zip

    五、Fastjson与同类库的比较 Fastjson在性能上通常优于Gson和Jackson,但在某些复杂场景下,Gson和Jackson的API可能会更易于理解和使用。选择JSON库时,需要综合考虑性能、易用性、社区支持等因素。 总结,...

Global site tag (gtag.js) - Google Analytics