最终采用了Jackson JSON,使用起来相当方便。
===========================================================================
本文地址:http://blog.csdn.net/chaijunkun/article/details/7208828,转载请注明出处。本博客会不定期对以前的文章内容进行补充和说明,强烈建议直接看博文原出处。
最近在研究JSON,Java中有很多处理JSON的类库,lib-json、sf-json、fastjson还有Jackson Json。第一个就不说了,性能和功能都没有什么亮点。
sf-json最大的优点就是随机读取方便。代码很简单:
JSONObject json= JSONObject.fromObject(str);
然后读取字段内容:
json.getString或者getInt之类的。但是工作效率有待商榷,而且容易出错。
另外sf-json还有个优点就是自动使用unicode编码,当内容中出现中文或者符号的时候会自动将其转换为\uFFFF这样的unicode编码。这样即便是在web服务器端的response中没有设置编码,直接推送json也不会出现乱码问题。
fastjson,顾名思义就是快。网上已经有很多性能对比的数据了,我就不多说其性能了。
这里要说的就是它的功能性问题。可能是定位不一样,最初fastjson就是要快,因此在对象的序列化与反序列化上下了很大功夫。但是在功能上有所缺乏。
不知在哪个版本开始加上了key按字典排序的功能。但是貌似这个功能没有办法关闭。有些时候我是不希望字段顺序被打乱的,这个问题就无法解决。
我使用的fastjson版本为1.1.14。另外fastjson还有一些bug没有解决,而且是比较明显的bug。例如在@JsonField 注解中format参数,这个是用来指定Date类型数据如何序列化的。如果你使用英文或符号,OK,没有问题(例如yyyy-MM-dd),但是格式中 一旦出现中文就会出错(例如yyyy年MM月dd日)。而且经过实验,所有的注解都要放在属性的Getter(就是getXXX()方法)上,直接放在属 性上是无法工作的。在eclipse中,一般我们都是直接写属性,属性写完后用自动生成的方式生成Getter和Setter方法。如果今后该类的属性发 生变化了,个人更倾向于直接删除所有Getter和Setter,然后重新生成。那么假如把注解全放到Getter上面,我删的时候就要非常小心。
再有一个比较致命的就是文档。几乎找不到全面的文档来介绍或支持fastjson。整个项目都由一个名为“温少”的人来负责,存在很多不确定的因素。
经过个人的评估,我更倾向于使用Jackson Json。首先说文档,Jackson Json官方网站上对每一个版本都有详尽的文档(http://jackson.codehaus.org/)。 另外Jackson Json的序列化与反序列化速度也并不见得有多慢。更重要的是它的注解支持要好于fastjson。就拿刚才说到的key按字典排序的功能吧,可以在实体 类上直接加上@JsonPropertyOrder(alphabetic=false)注解就可以关闭排序功能。而对于其他功能的注解支持也很好。
例如Date的序列与反序列化注解支持
@JsonSerialize(using=DateSerializer.class)
@JsonDeserialize(using=DateDeserializer.class)
private Date birthday;
这样就能指定对birthday字段的序列化与反序列化方法。另外,这两个注解都直接放在了属性上,没有放在Getter上。
针对上面的两个注解,我的序列化器是这样写的
public class DateSerializer extends JsonSerializer<Date>
继承了JsonSerializer,泛型中指定了序列化类型为Date,然后重写如下方法
@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException
方法中传进来的date就是将要被序列化的数据,接下来你可以任意展示该数据,在退出该方法之前使用gen.writeString(formattedDate);来完成序列化就可以了。
类似地,我的反序列化器是这样写的:
public class DateDeserializer extends JsonDeserializer<Date>
继承了JsonDeserializer,泛型中指定了反序列化类型为Date,然后重写如下方法
@Override
public Date deserialize(JsonParser parser, DeserializationContext context)throws IOException, JsonProcessingException {
这里面方法的返回值就是反序列化后的最终内容。方法内部你可以使用parser.getText()来获取到当前要处理的内容。你可以随便折腾里面的数据,只需要最后返回你想要的Date就可以了。
另外在制作基于Jackson Json的Service时想使用泛型的思想来写一个接口,最终目的就是希望方法能随着参数类型不同,返回值的类型也随之不同。以前很少写泛型的方法,这 个问题虽然基础,但是难住了我,经过查看Jackson Json的源代码,我得到了启示,像下面这样写就OK了:
public <T> T strToObj(String jsonStr, Class<T> clazz)
这样写就可以了。假设我有一个Result类型的对象需要反序列化,当前已经有了一个json字符串jsonStr,那么我只需要指定第二个参数clazz就可以直接得到Result类型的对象了:
Result newResult= jsonProcessService.strToObj(jsonStr, Result.class);
这样就不用在方法前加入(Result)类型强制转换了。
上面只是我的一些拙见,还请同仁们多多指教。
相关推荐
java 解析 json文件java 解析 json文件java 解析 json文件java 解析 json文件java 解析 json文件
Java实现自己的Json解析器——Json字符串解析原理 根据提取到的字符,转入不同的解析方法中, 例如字符是t,说明值可能是true,只需检查后面三个字符,如果是r、u、e,则可以直接返回true。 字符是f,说明值可能是...
本着探究 JSON 原理的目的,我将会在这DEMO中实现了一个简单的JSON解析器。由于 JSON 本身比较简单,解析起来也并不复杂。所以如果大家感兴趣的话,在看完本DEMO后,不妨自己动手实现一个 JSON 解析器。
附件内容为:Java组装map数据,然后转换为json数据格式;Java解析json数据
此压缩包包含两个jar:json-lib-2.4-jdk15.jar和ezmorph-1.0.6.jar 这两个包都是java解析json数据的依赖包,而且是最新版,开源的东东好多人还要分,俺不要分,只希望对你有用。
Java Json解析,Java Web Json解析,Java Web服务端获取Json数据,客户端通过HTTP获取Json数据
java中需要解析前端传过来的json数据,完成相应的格式转换~
java解析Json字符串java解析Json字符串java解析Json字符串java解析Json字符串
JSON官网上推荐的使用java解析json的类库,官网下载后的是未编译打包的java文件,这是我打包后的东东,使用时直接添加进Build path即可,简单实用……
java获取网络json数据包和解析json数据完整案例。 需要用到json.org也包含在里边。
这是java中json解析转换需要的jar包和依赖包,归类一起分享出来,大家就不用分开去去下载了!
在java中使用json封装数据和解析json数据的DEMO.
java JSON 解析 保证生成的JSON是有序结构,代码取至Android源码。
支持字符串转json等json用到的所有的jar包,commons-beanutils-1.7.0.jar,commons-collections-3.1.jar,commons-collections4-4.1.jar,commons-lang-2.5.jar,commons-logging.jar,ezmorph-1.0.3.jar,json-lib-...
一个C++编写的json解析器,源码来自一个开源项目。另外要,此解析器需要boost库的支持
原理:用时创建的规则降低传统解析器一次性将文本转成Java对象而占用大量内存空间,通过注册Filter并判断自己关注的KEY/VALUE来有选择的创建Java对象或JsonLazyer子对象。 使用方法可以查看jar包中的Sample.java示例...
非常好的Json解析器,兼容其极强,界面也非常简约,适合详细解析长json串
Java解析JSON源码。包括源码跟依赖包,下载后直接导入eclipse即可运行
关于java json解析的简单测试,简单示例