Gson使用
在Android中使用Gson寓落,先在Compile中加入編譯包
compile 'com.google.code.gson:gson 2.8.0'
可以去Gson的github官網(wǎng)查看最新版本
gson兩個主要的方法,一個是gson.toJson()
折柠,一個是gson.FromJson()
经宏,兩個方法都是簡潔易懂良蛮。
從對象變成Json字符串
Gson gson = new Gson();
Object obj = new Object();
String jsonString = gson.toJson(obj);
從Json字符串轉(zhuǎn)變?yōu)镺bj對象
String input;
Gson gson = new Gson();
Object obj = gson.from(input,Object.class);
1. json字段調(diào)整
有時候json中的field不能完全和自己的class對應(yīng)上哪怔,這時候就需要修改字段灶伊。但是有時候弥鹦,前端后端不同語言寫的肚逸,風(fēng)格就是有差異,就在字段前面使用:
@SerializedName("email_address")
publicString emailAddress;
這樣即使在字符串中得到的是加下劃線的彬坏,依然能夠?qū)?yīng)到Bean中朦促。注意:from和to都將是注解中的名字。
有這樣一種情況栓始,有的系統(tǒng)是這種务冕,有的系統(tǒng)是那種,要能夠全部兼容幻赚,那么Gson也提供了一種注解:
@SerializedName(value = "emailAddress", alternate = {"email", "email_address"})
public String emailAddress;
有備用的禀忆,在序列化時會按照emailAddress來,在反序列化時會優(yōu)先從value中找落恼,找不到再從alternate中找箩退。
2. Gson解析list
(1)如果想解析為數(shù)組
Gson gson = new Gson();
String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";
String[] strings = gson.fromJson(jsonArray, String[].class);
(2)如果想解析為List,因為java為偽泛型佳谦,如下可以做:
Gson gson = new Gson();
String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";
List<String> stringList = gson.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType());
3乏德、Gson有五種方法:
Gson.toJson(Object);
Gson.fromJson(Reader,Class);
Gson.fromJson(String,Class);
Gson.fromJson(Reader,Type);
Gson.fromJson(String,Type);
這樣就能在讀文件啥的流的過程中進(jìn)行Gson解析了,不過在Rxjava和retrofit的框架中已經(jīng)用上了Gson的流操作吠昭,不用自己麻煩了喊括。
4、Gson Builder用法
Gson gson = new GsonBuilder()
//各種配置
.create();
比如:
添加.serializeNulls()
將所有沒有值的field賦上null
添加.excludeFieldsWithoutExposeAnnotation()
矢棚,只有field前面有@Expose
注解的才會被序列化
添加.excludeFieldsWithModifiers(Modifier.FINAL, Modifier.STATIC, Modifier.PRIVATE)
排除掉final郑什,static,private字段
5蒲肋、Adapter
貼上一個現(xiàn)成的Gson配置
public static final Gson GSON_DEFAULT = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
.registerTypeAdapter(User.class, new UserTypeAdapter())
.registerTypeAdapterFactory(new CustomTypeAdapterFactory())
.enableComplexMapKeySerialization()
.create();
其中
.registerTypeAdapter(User.class, new UserTypeAdapter())
對個別calss作操作蘑拯,UserTypeAdapter()
類內(nèi)部進(jìn)行該類的序列化與反序列化的定制钝满,通過內(nèi)部覆寫read
和write
方法,達(dá)到定制的要求申窘。
6弯蚜、GsonAdapterFactory
CustomTypeAdapterFactory
就是自己的adapterFactory
。
如果用戶有很多的類需要定義剃法,為了避免在gson的配置中顯示太多的registerTypeAdapter
碎捺,gson就采用了將所有adapter集中在一個factory類中的方法。
然后在Factory的creat方法中完成操作贷洲。