写在前面:很纠结,当原创又没底气,当转载可却是我认真写出来的,我也很纠结,就当是转载吧。
首先说一下Gson的基本使用方法:Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化。这与后面说的内容会息息相关。。(废话)
接着,说一下Gson Builder,用以创建gson实例,直接上带有注释的代码:
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) //有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化. .disableHtmlEscaping()//默认是GSON把HTML 转义的,但也可以设置不转义 .serializeNulls()//把null值也转换,默认是不转换null值的,可以选择也转换,为空时输出为{a:null},而不是{} .create();有注释应该很好理解,同样的,这与后面说的内容会息息相关。。(废话X2)
最后,说下几个重要的注解:
1、@SerializedName
我感觉这是比较重要的注解之一,用于修改属性序列化成json之后的名字。举个例子:
@SerializedName("user_name") public String userName;当序列化的时候就会以user_name作为json中的名字,这样就不用为了传递消息时的命名而烦恼了。2.4版本之后还添加了另一个属性alternate,接收一个String数组。举个例子:
@SerializedName(value = "emailAddress", alternate = {"email", "email_address"}) public String emailAddress;这样的话,当上面的三个属性(email_address、email、emailAddress)都中出现任意一个时均可以得到正确的结果。 2、@Expose这也是个很重要的注解,用于表明当序列化和反序列化的时候,这个属性将会暴露给Gson对象。@Expose相当于@Expose (serialize = true, deserialize = true),序列化和反序列的时候都会导出,括号中的值可以修改为true和false。不添加该注解的属性默认两个均为false。serialize = false时,toJson()方法不生成该属性,deserialize = true,fromJson() 方法不解析该属性。
注意点:
Gson gson1=new Gson();//@Expose注解无效 Gson gson2=new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();//@Expose注解生效3、@Since和@Until
一组作用相反的注解,属性皆为版本号,用于表示自某个版本以后该属性新增(@Since(value=versioncode))或者删除(@Until(value=versioncode))(新增删除的意思是是否出现在序列化和反序列化的内容中)。
通过Gson gson = new GsonBuilder().setVersion(versioncode).create();来使用该注解,应该很容易理解。
以上就是全部内容啦,完结撒花~~~~