精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-05-31
最后修改:2012-06-01
-- 时隔大半年才有自己业余的时间对JsonConvert进行了一次大更新。 更新内容: 1、结构上进行大量的重构 2、支持更全面的泛型解析 3、支持json部分对象提取 4、支持非空构造函数的类 5、增加字段的具体类型配置 6、增加功能但代码反而减少40%
JsonConvert默认只提供支持最基本的类型: boolean--double、enum、Boolean--Double、String、以上类型的数组
下面介绍JsonConvert的使用方法: 一、常用方法:
解析时默认情况下Record的实例化是通过DefaultCreator进行创建的, 而DefaultCreator使用的是反射。 所以如果注重这点反射性能的话可以给Record注册一个Creator:
注意: 所有JsonFactory.register的方法必须在第一次使用JsonConvert之前调用。
通常JavaBean都会有个public无参数的构造函数, 但是如果有特殊情况或者JavaBean是第三方提供的。 在解析之前就必须给这个类注册一个带有@CreatorFields的Creator :
刚开始准备把JsonCreator用annotation来表示, 考虑到如果类是第三方提供的, 就无法使用annotation。
JsonListener作用于为简单的数据,json里属性值为字符串或者数值的都会使用JsonListener来解析或序列化。 JsonConvert默认只支持java的基本数据类型, 如果使用到例如Date、BigInteger这样的类需要事先注册: JsonFactory.register(Date.class, new JsonListener<Date>() { private final JsonListener<Long> listener = JsonFactory.findListener(long.class); @Override public void convertTo(JsonWriter out, Date value) { if (value == null) { out.writeNull(); } else { listener.convertTo(out, value.getTime()); } } @Override public Date convertFrom(final JsonReader in) { Long value = listener.convertFrom(in); return value == null ? null : new Date(value); } @Override public Class<Date> getType() { return Date.class; } }); JsonFactory.register(BigInteger.class, new JsonListener<BigInteger>() { @Override public void convertTo(JsonWriter out, BigInteger value) { if (value == null) { out.writeNull(); } else { out.write(true, value.toString()); } } @Override public BigInteger convertFrom(JsonReader in) { char[] text = in.readValue(); return text == null ? null : new BigInteger(new String(text)); } @Override public Class<BigInteger> getType() { return BigInteger.class; } }); 如果需要时间格式化之类的可以自定义JsonListener通过@JsonRef注册给字段。 之所以不提供Date类的 JsonListener 是因为long/int就足以表示时间, 无需Dae这么大的对象传递。
@JsonRef与JsonField提供的功能几乎一样(JsonField多了一个type)。 为什么需要JsonField类呢, 因为当JavaBean是第三方提供的话, 就无法使用@JsonRef给JavanBean进行设置, 只能依靠JsonField。 @JsonRef的定义:
例如给某个字段指定JsonListener:
剩下部分见楼下~~ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-05-31
最后修改:2012-06-01
五、泛型的支持: 在0.1版本里面支持只Class, 新版开始支持Type。 简单的泛型解析:
给类注入具体的解析类型:
六、拦截器: JsonConvert 提供一个在解析后、序列化前调用的拦截器:
例如:
JsonConvert 在几乎没有性能影响下使用栈支持简单的树型循环引用, 毕竟json的规范中无循环引用。 只有当解析类或序列化类存在循环的可能才会启动栈。 parent / \ / \ / \ node1 node2 / \ / \ / \ / \ / \ / \ child1 child2 child3 child4 如图树型引用就是child1只能引用node1、parent;node1只能引用parent。而child1不能引用node2、child2。
为了让输出的json字符串长度尽量减少, 可以进行以下设置: //输出字段名不需要引号。 1、 JsonFactory.setFieldQutoable(false); //boolean 值以0、1输出。 2、 JsonFactory.register(boolean.class, JsonBoolListener.JsonBoolHexListener.getInstance()); //boolean[] 值以01010011字符串输出。 3、 JsonFactory.register(boolean[].class, JsonBoolArrayListener.JsonBoolArrayHexListener.getInstance()); //byte[] 值以16进制字符串输出。 3、 JsonFactory.register(byte[].class, JsonByteArrayListener.JsonByteArrayHexListener.getInstance()); //char[] 值以字符串输出。 4、 JsonFactory.register( char[].class, JsonCharArrayListener.JsonCharArrayHexListener.getInstance());
目前fastjson是号称性能最好的json库, 下面是与fastjon 1.1.17版本简单性能的比较结果:
由结果看出jsonconvert性能比fastjson稍好些~ 说明一点: MediaContent是根据jvm-serializers提供的数据类 MediaContent2跟MediaContent的区别只是将List<Image> images 改成 Image[] images.
附件提供test源码~~
https://tendon.googlecode.com/svn/trunk/tendon.jsonconvert/tags/0.2.0/
|
|
返回顶楼 | |
发表时间:2012-05-31
LZ 那个循环引用你怎么处理的啊?
|
|
返回顶楼 | |
发表时间:2012-05-31
char1st 写道 LZ 那个循环引用你怎么处理的啊?
JsonConvert只实现了简单树型循环, 不支持网状的嵌套循环, 毕竟json的规范是不支持循环的。 循环是通过JsonSimpleable来判断对象类是不是有包含循环的可能。 如果存在循环的可能, 在序列化的时候构建一个栈,每序列化一个对象时判断是否在栈内存在。 |
|
返回顶楼 | |
浏览 3871 次