- 浏览: 22967 次
-
最新评论
一个简单的 Model .
fastjson
如果要 json 化的对象是一个自定义类型的对象.
利用 com.alibaba.dubbo.common.bytecode 里面的工具类,
Wrapper com.alibaba.dubbo.common.bytecode.Wrapper.makeWrapper(Class<?> c)
生成 Model 类的一个 Wrapper 类, Wrapper 类是一个利用 javassist 动态生产的一个包装工具类.比如 Model 类的 Wrapper 类里的方法有:
里面的方法是遍历 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 里面有一个
value 参数就是 Model 类的实际对象. 然后遍历属性写到 Writer out 流中,实际上JsonWriter 就是一个 StringWriter.
然后... StringWriter.toString , json 就出来了.
----------------------------------------------------------------------------------
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 ,
- 如果普通日常使用,推荐使用 fastjson,简单易懂,并且是国内程序员开发,有问题可以较容易的获得支持. Gson 有对各种类型的属性支持, 如果有特殊类型json化需求可以选择 gson ,并自定义扩充.
Gson 使用的是遍历 TypeAdapterFactory集合,在每个 TypeAdapterFactory 里面做判断.而且使用了 N 多的匿名内部类, 想要一眼看出有哪些 TypeAdapterFactory 的实现都很困难.
发表评论
-
httpclient 4.3 ignore certificate
2014-04-22 10:01 634public static CloseableHtt ... -
ActiveMQ 2 ActiveMQ ReplicationLevelDB
2014-01-08 21:26 1263这里只是简述我的配置以及碰到的问题. <broker ... -
ActiveMQ 1
2014-01-06 17:30 763下载安装 ActiveMQ 网上有 N 多例子, 就不说什么了 ... -
spring 集成 cxf 时, @PostConstruct 执行2次.
2013-12-02 18:26 974引用https://issues.apache.org/jir ... -
Hessian, CXF, Spring httpinvoke 对比
2013-11-25 16:25 2888做了一个 Hessian, CXF, Spring httpi ... -
Java Object 有多大? (转帖)
2013-11-14 16:44 892public class ObjectMemorySize ... -
Executors.newCachedThreadPool 线程重用
2013-11-14 16:09 1160想起一个小细节: 线程池 CachedThreadPool ... -
一个最简单的 RPC 程序
2013-11-14 12:47 1018一个最简单的 RPC 程序. Service 接口 pu ... -
spring mvc 3.2.4 使用@ResponseBody 返回 406
2013-10-02 22:57 1214<mvc:annotation-driven co ... -
spring 3.1.1 使用 @Value 注解无法注入属性.
2013-09-25 17:24 1926spring 3.1.1 使用 @Value 注解无法注入属性 ... -
Java OSGi 入门
2013-08-26 20:02 988OSGi 的核心就是一个 JVM ... -
javassist case
2013-07-29 19:39 993一个普通的类,一个 name 属性, 只有 getter 方法 ... -
dev tips
2013-05-28 11:21 648换行符: String lineSeparator = (St ... -
Spring 自定义命名空间 xsd
2013-05-21 19:08 1595编写这两个文件 META-INF/spring.handler ...
相关推荐
本文将详细探讨两个流行的Java JSON库:谷歌的Gson.jar和阿里的fastJson.jar,以及它们在处理JSON与Java对象之间转换(特别是与List类型)的方法。 首先,我们来看谷歌的Gson库。Gson是Google提供的一个开源项目,...
Fastjson相比于Jackson、Gson等其他流行的JSON库,优势在于其更高的性能、更简洁的API以及对Java特性的深度支持。尽管每个库都有其适用场景,但在处理大量数据和需要快速转换时,Fastjson往往能提供更好的解决方案。...
JSON.jar、GSON.jar和FASTJSON.jar是三个不同的Java库,它们都提供了处理JSON的API。 1. **JSON.jar**: 这个JAR包可能包含一个基本的JSON解析和生成工具。在Java中,JSON.jar可能提供简单的函数来将Java对象转换为...
与其他如Jackson、Gson等Java JSON库相比,Fastjson在速度上有优势,且API设计更符合中国开发者习惯,对于处理中文字符的支持也更为友好。然而,每个库都有其适用场景,选择时应结合项目需求进行评估。 五、集成与...
Person deserializedPerson = gson.fromJson(jsonString, Person.class); ``` **二、高级特性** 1. **类型转换** Gson可以处理基本数据类型,如整型、浮点型、字符串,以及自定义的复杂对象。在处理复杂类型时...
1. **高性能**:Fastjson在处理大规模JSON数据时表现出优秀的性能,它的解析速度比其他流行的JSON库如Jackson、Gson等更快。 2. **简单易用**:Fastjson的API设计简洁,易于理解和使用。例如,可以使用`JSON....
阿里巴巴公司研发的fastjson1.2.8的jar包 以及源码包,是目前开源json解析包中速度最快的工具包,但其在复杂的bean类转json的时候存在一定的问题,所以搭配Gson解析一起。 给各位童鞋一个查找jar包的方式:...
3. 性能调优:根据实际需求,可以启用或禁用Fastjson的一些高级特性,如开启Gson兼容模式、禁用自动类型转换等,以达到最佳的性能表现。 总的来说,Fastjson2-2.0.39是Java开发中处理JSON数据的强大工具,它提供了...
Gson的主要功能是通过`Gson.toJson()`方法实现对象到JSON的序列化,以及`Gson.fromJson()`方法实现JSON到对象的反序列化。Gson还支持自定义类型转换器,可以满足定制化的需求。 3. **Jackson**:Jackson是由...
Person person = gson.fromJson(jsonString, Person.class); // 序列化 String json = gson.toJson(person); ``` ### 比较与选择 1. **性能**:`fastjson`通常比`gson`更快,但两者在大多数场景下性能差异并不...
3. JSON到Java对象:使用`Gson.fromJson()`方法将JSON字符串转换为Java对象。 ```java Gson gson = new Gson(); MyObject obj = gson.fromJson(jsonString, MyObject.class); ``` 4. Java对象到JSON:使用`Gson...
本文将深入探讨两个流行的Java JSON库:Fastjson和Gson,以及它们在处理JSON时的关键特性和使用方法。 首先,我们来看`fastjson-1.2.68.jar`,这是阿里巴巴开发的一个高性能的JSON库。Fastjson的特点在于其快速的...
`protostuff`、`fastjson`和`gson`就是三个流行的Java序列化库,它们各自具有独特的特性和优势。 首先,让我们详细了解一下这三个库: 1. **protostuff**: - Protostuff是一个非常快速且灵活的序列化框架,它...
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以其优秀的性能著称,它的解析和生成速度通常快于其他同类库,如Jackson和Gson。此外,它还提供了流式处理模式,对于处理大量数据时,可以显著降低内存消耗。 ### 特性与优化 - **类型转换**:Fastjson...
这里提到的"fastjson gson mysql ojdbc commons-io dom4j解析包"包含了几个关键的Java库,它们各自在不同的场景下发挥着重要作用。下面将详细阐述这些库的主要功能和用途。 1. **Fastjson**:由阿里巴巴开发的高...
1. 高性能:FastJson的解析速度非常快,相比其他同类库如Jackson和Gson,其在大量数据处理时表现出更优秀的性能。 2. 简单易用:API设计简洁,支持多种转换方式,使得代码编写更加直观。 3. 动态类型:FastJson支持...
然而,值得注意的是,尽管FastJsonJar在性能上表现出色,但在某些特定场景下可能不如其他库如Gson或Jackson稳定,因此在实际使用时,应根据项目需求和具体场景选择合适的JSON库。 总的来说,FastJsonJar作为一款...
五、Fastjson与同类库的比较 Fastjson在性能上通常优于Gson和Jackson,但在某些复杂场景下,Gson和Jackson的API可能会更易于理解和使用。选择JSON库时,需要综合考虑性能、易用性、社区支持等因素。 总结,...