日常搬磚 gson 解析json

其實(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í)間 能夠想到的是泛型。


image.png

image.png

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


image.png

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

泛型也可以這么用。這個(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è)別名的。大概這么使用。


image.png

當(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ò)誤,歡迎指正,謝謝了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概況 Gson是一個(gè)Java庫,它可以用來把Java對(duì)象轉(zhuǎn)換為JSON表達(dá)式,也可以反過來把JSON字符串轉(zhuǎn)換成與...
    木豚閱讀 7,002評(píng)論 0 2
  • 泛型: https://juejin.im/post/5b614848e51d45355d51f792#headi...
    RexHuang閱讀 7,068評(píng)論 0 0
  • 一. 序 前幾天寫了一篇,關(guān)于利用 GSON 在 JSON 序列化和反序列化之間,數(shù)據(jù)容錯(cuò)的文章。最簡(jiǎn)單的利用 @...
    承香墨影閱讀 4,789評(píng)論 4 11
  • 為了更好的學(xué)習(xí)Gson,特將Gson User Guide翻譯如下。由于本人英文水平有限,如有錯(cuò)誤,還請(qǐng)指正,謝謝...
    WeberLisper閱讀 7,059評(píng)論 0 6
  • 非常抱歉,只要我做監(jiān)考,總是能發(fā)現(xiàn)帶手機(jī)、帶小抄的學(xué)生,我常常當(dāng)場(chǎng)收卷,而學(xué)生到底什么心情,我并不十分清楚。有的會(huì)...
    活著不易閱讀 477評(píng)論 0 4

友情鏈接更多精彩內(nèi)容