- 浏览: 21996 次
最新评论
一个简单的 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 590public static CloseableHtt ... -
ActiveMQ 2 ActiveMQ ReplicationLevelDB
2014-01-08 21:26 1212这里只是简述我的配置以及碰到的问题. <broker ... -
ActiveMQ 1
2014-01-06 17:30 722下载安装 ActiveMQ 网上有 N 多例子, 就不说什么了 ... -
spring 集成 cxf 时, @PostConstruct 执行2次.
2013-12-02 18:26 922引用https://issues.apache.org/jir ... -
Hessian, CXF, Spring httpinvoke 对比
2013-11-25 16:25 2816做了一个 Hessian, CXF, Spring httpi ... -
Java Object 有多大? (转帖)
2013-11-14 16:44 835public class ObjectMemorySize ... -
Executors.newCachedThreadPool 线程重用
2013-11-14 16:09 1107想起一个小细节: 线程池 CachedThreadPool ... -
一个最简单的 RPC 程序
2013-11-14 12:47 969一个最简单的 RPC 程序. Service 接口 pu ... -
spring mvc 3.2.4 使用@ResponseBody 返回 406
2013-10-02 22:57 1168<mvc:annotation-driven co ... -
spring 3.1.1 使用 @Value 注解无法注入属性.
2013-09-25 17:24 1874spring 3.1.1 使用 @Value 注解无法注入属性 ... -
Java OSGi 入门
2013-08-26 20:02 939OSGi 的核心就是一个 JVM ... -
javassist case
2013-07-29 19:39 897一个普通的类,一个 name 属性, 只有 getter 方法 ... -
dev tips
2013-05-28 11:21 609换行符: String lineSeparator = (St ... -
Spring 自定义命名空间 xsd
2013-05-21 19:08 1548编写这两个文件 META-INF/spring.handler ...
相关推荐
谷歌的Gson.jar和阿里的fastJson.jar
JSON GSON FASTJSON jar包
protostuff fastjson gson 高性能序列化jar包
java中JSON解析jar包: fastjson-1.2.68.jar gson-2.8.6.jar
fastjson gson jackjson json-lib org.json的使用例子 ... import com.google.gson.Gson; import com.google.gson.GsonBuilder;... String prettyJson = gson.toJson(jsonEl); return prettyJson; } }
此案例,描述了android中常用的三种json解析方式,josn,fastjson,gson
fastjson、gson、jackson序列化和反序列化所用json文件
有六种类型的jar包,commons-io,dom4j,fastjson,gson,mysql,ojdbc
Java处理JSON数据有三个比较流行的类库FastJSON、Gson和Jackson。本文将测试这三个类库在JSON序列化和反序列化的方面表现,主要测试JSON序列化和反序列化的速度。为了防止由于内存导致测试结果出现偏差,测试中对JVM...
阿里巴巴集团的 GSON解析框架:fastjson-1.2.56;非常好用的gson解析工具;fastjson-1.2.56;fastjson-1.2.56;fastjson-1.2.56;fastjson-1.2.56;
gson 解析json fast
android中的JSON数据解析库gson和fastjson,gson.jar和fastjson.jar是android中解析JSON数据非常好用的两个工具
fastjson-1.2.38.jar,在博客http://blog.csdn.net/binjianliu中有FastJson的基础使用详解,并有对Gson和Jackson的基础使用详解,可对照选择使用
fastJson和gson的用法,解析最常用的是 json ,fastjson第三方库http://fastjson.codeplex.com/ http://www.json.org/
fastjson由alibaba开源的一套json处理器。与其他json处理器(如Gson,Jackson等)相比有比较明显的性能优势。
JSON是一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便。...解析和生成的方式很多,Java中最常用的类库有:JSON-Java、Gson、Jackson、FastJson等。 http://json.org/json-zh.html
阿里巴巴公司研发的fastjson1.2.8的jar包 以及源码包,是目前开源json解析包中速度最快的工具包,但其在复杂的bean类转json的时候存在一定的问题,所以搭配Gson解析一起。 给各位童鞋一个查找jar包的方式:...
JSON中fastjson、jackson、gson如何选择.docx
retrofit converter-gson converter-scalars fastjson .... jar包 找了半天,在csdn下的全是缺少这缺少那的,下载全齐了。