其實(shí)本來沒有打算寫這個(gè)調(diào)調(diào)的,但是,誰知道呢。
市面上常用的解析json 的工具還是蠻多的。因?yàn)閍s 有一個(gè) gsonfomat ,感覺再去用其他的,感覺有點(diǎn)不好意思,誰知道呢,反正就用gson 了。
廢話就不多說了,現(xiàn)在一般情況下,服務(wù)器接口都是返回的json 格式。通常來說 服務(wù)器 返回的數(shù)據(jù) 會(huì)在最外面包裝一層數(shù)據(jù),使得真正有用的數(shù)據(jù)是一個(gè)內(nèi)部類。大概長(zhǎng)這個(gè)樣子。
{
"code": 1,
"data": {},
"msg": ""
}
data 就是 我們要求的數(shù)據(jù),code 是服務(wù)器定義的錯(cuò)誤碼,msg 就是信息。嗯嗯,大致就是這樣樣子了。因?yàn)橛械臄?shù)據(jù)里面data 是對(duì)象,有的是數(shù)組。所以這個(gè) 需要在自己定義entity 的時(shí)候 自己 注意就好了,這個(gè)還是看后臺(tái)的。比如現(xiàn)在的后臺(tái)對(duì)數(shù)字是包裹了一層的。像這個(gè)樣子。
{
"code": 1,
"data": {
"nowPage": 1,
"list": [],
"totalPage": 2,
"hasNextPage": true,
"totalSize": 13,
"signNewNums": 0,
"nums": 0
},
"msg": "操作成功"
}
list 才是 需要的數(shù)據(jù)。但是 無論如何,最外層的
{ "code": 1,"data": {},"msg": ""}
是相同的,所以 第一時(shí)間 能夠想到的是泛型。


通過 泛型T 將內(nèi)部類傳遞進(jìn)去解析。這么 我們建立entity 的時(shí)候就只需要 創(chuàng)建不同的地方了。使用 大概 就是 :

但是,可能就不是Retrofit。如果 直接 通過 gson class 解析 可能會(huì)出問題,我也忘了 是解析 數(shù)組還是對(duì)象出的問題了。這個(gè)時(shí)候就需要一個(gè) TypeToken,大概是這樣用的,

泛型也可以這么用。這個(gè)TypeToken 的擴(kuò)展就多的去了,這個(gè)可以解析解析 list,map ,set 之類的(set我沒有用過,但是應(yīng)該沒有問題)
上面的都是一些很基礎(chǔ)很常用的東西。
現(xiàn)在說一點(diǎn)不常用的。
有些時(shí)候,和服務(wù)器端的大佬 默契度不夠的時(shí)候,本地控制邏輯的entity 和服務(wù)器返回的entity 不一樣的時(shí)候,又需要使用服務(wù)器返回的數(shù)據(jù)的時(shí)候,就可以考慮采用 @SerializedName("cc_json") ,用于設(shè)置字段別名。好像同一個(gè)值是可以設(shè)置多個(gè)別名的。大概這么使用。

當(dāng)然默契度太低的時(shí)候,建議手動(dòng)new 對(duì)象 賦值。
還有一種情況,本地填寫的數(shù)據(jù),要使用json 通過表達(dá)提交 給服務(wù)器。但是呢,本地定義的entity 里面有一些多余的字段或者原始字段怎么辦呢,服務(wù)器又要求你不上傳這些給他,解決辦法很多,1個(gè)就是新建一個(gè)對(duì)象 賦值然后轉(zhuǎn)json,還有一個(gè)就是通過gson 忽略字段了。@Expose 只有該對(duì)象上注解了 這個(gè)的才會(huì)打印出來。當(dāng)然 這個(gè)需要 在gson create 之前開啟 Expose 才可以使用。比如這樣:
public class GsonHelper {
private final Gson gson;
public GsonHelper() {
gson = new GsonBuilder()
.setLenient()// json寬松
.enableComplexMapKeySerialization()//支持Map的key為復(fù)雜對(duì)象的形式
.serializeNulls() //智能null
.setPrettyPrinting()// 調(diào)整格式 ,使對(duì)齊
.disableHtmlEscaping() //默認(rèn)是GSON把HTML 轉(zhuǎn)義的
//.setExclusionStrategies(excludeStrings) //自定義排除轉(zhuǎn)json的字段或者類名
.excludeFieldsWithoutExposeAnnotation()//啟用 @Expose
.create();
}
public String toJson(Object object){
return gson.toJson(object);
}
}
使用:就是new GsonHelper().tojson(T);T 是傳入的對(duì)象。
但是呢,有的時(shí)候,同一個(gè)對(duì)象 忽略的字段在不同的功能上 是不同的,就需要涉及到動(dòng)態(tài)忽略了。
和上面差不多,同樣是 需要在gson create 之前進(jìn)行設(shè)置。
Gson gson=new GsonBuilder().setExclusionStrategies(new CurrencyExpose(ExposeDataUtils.getHospitalDepartments())).create();
主要是 setExclusionStrategies();
/**
* 通用 忽略字段。
*/
public class CurrencyExpose implements ExclusionStrategy {
List<String> keys=new ArrayList<>();
public CurrencyExpose(List<String> keys) {
this.keys.clear();
this.keys.addAll(keys);
}
@Override
public boolean shouldSkipField(FieldAttributes f) {
return keys.contains(f.getName());
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
}
ExposeDataUtils.getHospitalDepartments()主要是獲取 忽略的字段的字段名。
其他類似 擴(kuò)展 由于我也沒有用過,所以,請(qǐng)百度下 ExclusionStrategy吧。
好了,大概就是這些了,如有錯(cuò)誤,歡迎指正,謝謝了。