对Java中JSON解析器的一些见解
最近在研究JSON,Java中有很多处理JSON的类库,lib-json、sf-json、fastjson还有Jackson Json。第一个就不说了,性能和功能都没有什么亮点。
JSONObject json= JSONObject.fromObject(str); 然后读取字段内容: json.getString或者getInt之类的。但是工作效率有待商榷,而且容易出错。 另外sf-json还有个优点就是自动使用unicode编码,当内容中出现中文或者符号的时候会自动将其转换为uFFFF这样的unicode编码。这样即便是在web服务器端的response中没有设置编码,直接推送json也不会出现乱码问题。
这里要说的就是它的功能性问题。可能是定位不一样,最初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。整个项目都由一个名为“温少”的人来负责,存在很多不确定的因素。
例如Date的序列与反序列化注解支持 @JsonSerialize(using=DateSerializer.class) 这样就能指定对birthday字段的序列化与反序列化方法。另外,这两个注解都直接放在了属性上,没有放在Getter上。 针对上面的两个注解,我的序列化器是这样写的 public class DateSerializer extends JsonSerializer<Date> 继承了JsonSerializer,泛型中指定了序列化类型为Date,然后重写如下方法 @Override 方法中传进来的date就是将要被序列化的数据,接下来你可以任意展示该数据,在退出该方法之前使用gen.writeString(formattedDate);来完成序列化就可以了。 类似地,我的反序列化器是这样写的: public class DateDeserializer extends JsonDeserializer<Date> 继承了JsonDeserializer,泛型中指定了反序列化类型为Date,然后重写如下方法 @Override 这里面方法的返回值就是反序列化后的最终内容。方法内部你可以使用parser.getText()来获取到当前要处理的内容。你可以随便折腾里面的数据,只需要最后返回你想要的Date就可以了。
public <T> T strToObj(String jsonStr,Class<T> clazz)
Result newResult= jsonProcessService.strToObj(jsonStr,Result.class);
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |