Json一种非常常用的数据交换方式,又因为我们现在Web框架使用的Easyui(其中最常用的table表格绑定的Json数据),Json的应用就必不可少了,我们现在从后台数据库得到的数据常用的类型是实体和list,都属于集合,性质是一样的,从实体或者list转成Json数据传到界面就是最关键的了。
其实Java中Json的解析方式有很多种,我们可以直接使用Java的JSONObject库,除此之外还有fastjson,Gson,jackson等等这些Json处理类库,共同之处不仅方便我们开发,转换效率也更快。
今天我们先来看Gson——Google荣誉出品。
一、引入Jar包
如果是maven项目的话,直接pom中引入即可,当然也可以直接引入Jar包。
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
二、使用,以List to Json为例
使用上很简单,最主要的三步:
//实例一个Gson
Gson gson = newGson();
//实例一个泛型的List(一般是从数据库查询返回)
List<Class> list = new ArrayList<Class>();
//调用转换方法toJson即可
String json = gson.toJson(list);
三、实际问题
如果只想导出某个实体属性或者实体中有关联其他实体,我们并不想把关联实体(list中嵌套这list)也导出到Json,尤其是后一种情况比较常见,之前我们是从list中remove不相关的内容,但是我们实体变得时候,之前remove就不可控制了。再来看通过Gson如何处理这种情况。
1、首先是在实体属性上通过注解标识需要转换的属性
publicclass School{
@Expose
private String code;
@Expose
private String name;
private String remark
privateSet<Build> builds = new HashSet<Build>();
}
2、使用GsonBuilder
唯一不同于上面的是实例化的类是GsonBuilder,并且需要调用下面的方法:
Gson gson = newGsonBuilder()
.excludeFieldsWithoutExposeAnnotation() //<span style="font-family:SimSun;">只导出实体中</span>用@Expose注解的属性
.create();
默认情况下@Expose注解是不起作用的,除非你用GsonBuilder创建Gson的时候调用了GsonBuilder.excludeFieldsWithoutExposeAnnotation()方法。
注:如果仅仅是想把某些特定的字段包含在外和话,可以使用transient 关键字声明字段。
GsonBuilder常用的设置:
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation() //不导出实体中没有用@Expose注解的属性
.enableComplexMapKeySerialization() //支持Map的key为复杂对象的形式
.serializeNulls().setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")//时间转化为特定格式
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效.
.setPrettyPrinting() //对json结果格式化.
.setVersion(1.0) //有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化.
//@Since(版本号)能完美地实现这个功能.还的字段可能,随着版本的升级而删除,那么
//@Until(版本号)也能实现这个功能,GsonBuilder.setVersion(double)方法需要调用.
.create();
四、小结
选择转换属性问题解决了,如果就想把关联的list转换成Json呢,下文再继续,继续结合业务测试,继续站在巨人的肩膀上。我们目前的问题肯定已经有了解决方案,待我们探索。
附一
李坤师哥:
附二
Google:
http://google-gson.googlecode.com/svn/tags/gson-2.3.1/docs/javadocs/com/google/gson/Gson.html
附三
性能测试:
网上测试有很多,普遍的反映出的是jackson对大数据量的装换性能更好(10倍以上),不过都不是现在的最新版本,后面自己来个新版本的测试。