JSON

Java JSON技术框架选型、测试及容易使用

字号+ 作者:H5之家 来源:H5之家 2016-05-13 14:00 我要评论( )

Java JSON技术框架选型、测试及简单使用 Java JSON技术框架选型、测试及简单使用 (本文转载自’http://bbs.jee-soft.cn:8086/showtopic-155.aspx‘) 一、JSON

Java JSON技术框架选型、测试及简单使用

Java JSON技术框架选型、测试及简单使用

(本文转载自’:8086/showtopic-155.aspx‘)

一、JSON



JSONBean5个线程并发,约200字节对象,1千万次转换:



13952.8

700


BeanJSON5个线程并发,约200字节对象,1千万次转换:



17308.2

560

下面是参考Fastjson的测试数据(

性能对比




测试案例 JSON-Lib Simple-JSON Fastjson Jackson

563 596

677 774

208 230

功能对比






特性 JSON-Lib Simple-JSON Fastjson Jackson

支持 支持

支持 支持

支持 支持

支持 支持

支持 支持



参考博文(

最近在研究JSONJava中有很多处理JSON的类库,lib-jsonsf-jsonfastjson还有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),但是格式中一旦出现中文就会出错(例如yyyyMMdd日)。而且经过实验,所有的注解都要放在属性的Getter(就是getXXX()方法)上,直接放在属性上是无法工作的。在eclipse中,一般我们都是直接写属性,属性写完后用自动生成的方式生成GetterSetter方法。如果今后该类的属性发生变化了,个人更倾向于直接删除所有GetterSetter,然后重新生成。那么假如把注解全放到Getter上面,我删的时候就要非常小心。

再有一个比较致命的就是文档。几乎找不到全面的文档来介绍或支持fastjson。整个项目都由一个名为温少的人来负责,存在很多不确定的因素。


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 {

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Java软件开发工程师求职简历模板

    Java软件开发工程师求职简历模板

    2016-05-11 18:02

  • 使用Java 反射,对类中成员变量赋值.将Json对像转为Java对像

    使用Java 反射,对类中成员变量赋值.将Json对像转为Java对像

    2016-05-11 17:03

  • C#序列化和反序列化综合案例

    C#序列化和反序列化综合案例

    2016-05-08 14:06

  • javascript JSON操作入门实例

    javascript JSON操作入门实例

    2016-04-29 12:00

网友点评