在项目开发过程中,我是做前端的,总是和后台吵吵这么一个问题,命名习惯不一致。比如用户名称这个字段,我习惯使用驼峰命名方式,命名为userName,而我们后台人好多,有的命名为userName,有的命名为user_name,有的命名为username。再解析时,十分的烦躁。你们是否碰到过这烦躁的问题?
注解是Gson的强大存在之一,为实际情况解决了很多问题。使用了注解,我才知道Google的大牛们的考虑周全,解决了刚才的烦躁。如果你也碰到这种问题,细细的往下看,定有收获!
1. GsonBuilder
之前重建Gson实例通过newGson(),时会创建一个带有默认配置 选项的Gson实例。如果不想使用默认配置,那么就可以通过GsonBuilder,对Gson进行相关配置后再进行创建Gson实例。如果使用注释,创建Gson时就需要使用GsonBuilder。例如:
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation() //不导出实体中没有用@Expose注解的属性
.enableComplexMapKeySerialization() //支持Map的key为复杂对象的形式
.setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")//时间转化为特定格式
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效.
.setPrettyPrinting() //对json结果格式化.
.setVersion(1.0) //有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化.
//@Since(版本号)能完美地实现这个功能.还的字段可能,随着版本的升级而删除,那么
//@Until(版本号)也能实现这个功能,GsonBuilder.setVersion(double)方法需要调用.
.disableHtmlEscaping()//默认是GSON把HTML 转义的,但也可以设置不转义
.serializeNulls()//把null值也转换,默认是不转换null值的,可以选择也转换,为空时输出为{a:null},而不是{}
.create();
2.Gson注解
1.@SerializedName
用于修改属性序列化成json之后的名字。
此注解作用在属性上,表明这个属性在序列化成Json的时候,需要将名字序列化成注解的value属性指定的值。
众所周知,json的生成和解析的字段是一一对应的,也有一定的容错机制。但是前端和后台对于字段的定义,总会有不默契的时候。例如:
根据前端的bean定义可知,json样式应为
{"userName":"张三","userAge":23,"userEmail":"男"}
但是 后台返回的字段为
{"user_name":"张三","user_age":23,"user_email":"男"}
若是出现了,此种情况该如何解析呢?肯定有机智的小伙伴说,修改下字段就可以了。让前端改还是后台改,总会出现
不和谐的声音?还好google给力我有力的支持,@SerializedName 强势出现了。
Gson在序列化和反序列化时需要使用反射,说到反射就不得不想到注解,一般各类库都将注解放到annotations包下,打开
源码在com.google.gson包下果然有一个annotations,里面有一个SerializedName的注解类,这就是我