Java-Gso-json字符串解析-php后臺返回字段類型可能為字符串(/空字符串)或者對象的情況

其實(shí)本來android前端定義的對象類型是對象,如果后臺沒有值的情況下,理論上給null,如果是數(shù)組給[]或者null都可以的。這樣Gson再解析轉(zhuǎn)換的時候就不會出問題!但是最近重構(gòu)發(fā)現(xiàn)后臺如果沒有字段值給的是""空字符串,有值給的是對象字符串,比如下面:

    "\"test\":" +
                "{" +
                "\"name\": \"hl\", " +
                "\"id\": \"110\"" +
                "}," +

這樣我的Gson解析就報了字段類型不匹配的相關(guān)錯誤!最好的解決方式,其實(shí)是后臺字段規(guī)范統(tǒng)一,而且盡量不要給臟數(shù)據(jù),否則時間長很難維護(hù)和優(yōu)化!

另外一種情況就是前端做特殊處理,用Object去接收,用Object去接收的話,使用的時候就相對麻煩,你需要自己做轉(zhuǎn)換!

比如你的test字段定義的是Object test; 那么Gson解析的時候得到的結(jié)果類型是

  class com.google.gson.internal.LinkedTreeMap

也就是一個hashmap的一種類型,這個時候就不是你說的對象了。那怎么辦?一種情況是,你判斷下如果是這種類型的話,如下操作:

先把linkedTreeMap對象轉(zhuǎn)成json字符串,然后再轉(zhuǎn)成JavaBean

Gson gson = new Gsonbuilder.enableComplexMapKeySerialization().create();
String jsonString = gson.toJson(linkedTreeMap);
JavaBean bean = gson.fromJson(jsonString,JavaBean.class);

另一種方式就是JavaBean提供一個構(gòu)造函數(shù),允許傳入LinkedTreeMap進(jìn)行構(gòu)造,相當(dāng)于自己取值來給對象變量賦值!貌似第一種方式更好。采用第一種,你可以判斷是LinkedTreeMap還是String類型,然后統(tǒng)一做處理!相當(dāng)于就統(tǒng)一封裝到了請求數(shù)據(jù)解析環(huán)節(jié).....

附上自己的一些練習(xí)學(xué)習(xí)吧:

import com.google.gson.Gson;
import com.google.gson.internal.LinkedTreeMap;

import java.util.Map;
import java.util.Set;

public class TEstSVDF {
    private class User {
        private Object test;
        private String aa;
        private String age;

        public Object getTest() {
            return test;
        }

        public void setTest(Object test) {
            this.test = test;
        }

        public String getAa() {
            return aa;
        }

        public void setAa(String aa) {
            this.aa = aa;
        }

        public String getAge() {
            return age;
        }

        public void setAge(String age) {
            this.age = age;
        }

        private class Test {
            private String id;
            private String name;
        }
    }

    public static void main(String[] args) {
        Object a = 1;
        Object b = 10;
        System.out.println("托爾斯泰" + (a.toString() + b));

        String jsonStr = "{" +
                "\"test\":" +
                "{" +
                "\"name\": \"hl\", " +
                "\"id\": \"110\"" +
                "}," +
                " \"aa\":\"啊\", " +
                "\"age\": \"10000\"" +
                "}";
        String jsonStr2 = "{" +
                "\"test\":\"sb\", " +
                "\"aa\":\"啊\", " +
                "\"age\": \"10000\"" +
                "}";
        Gson gson = new Gson();
        User user = gson.fromJson(jsonStr, User.class);
        User user2 = gson.fromJson(jsonStr2, User.class);

        System.out.println(user.getAa());
        System.out.println(user.getAge());
        System.out.println(user.getTest().getClass());

        if (user.getTest() instanceof LinkedTreeMap) {
            // 遍歷
            Set set = ((LinkedTreeMap) user.getTest()).entrySet();
            for (Object o : set) {
                Map.Entry entry = (Map.Entry) o;
                System.out.print(entry.getKey() + ":" + entry.getValue() + "  ");
            }
            // 對應(yīng)取值
            LinkedTreeMap linkedTreeMap = (LinkedTreeMap) user.getTest();
            System.out.print(linkedTreeMap.get("id"));
            System.out.print(linkedTreeMap.get("name"));
        } else if (user.getTest() instanceof User.Test) {
            User.Test test = (User.Test) user.getTest();
            System.out.println("id=" + test.id);
            System.out.println("name=" + test.name);
        }

        if (user2.getTest() instanceof String) {
            System.out.println(user2.getTest());
        }
    }
}

image

Gson支持泛型喲。。。那樣的話,或許對你自己封裝rx家族,自定義處理請求和數(shù)據(jù)有很大幫助。小萌新的之前封裝的目前來用還是不錯。。但是今天又接觸了一些Gson的東西后,還可以再完善下.....當(dāng)然還得多向好的第三方庫學(xué)習(xí).....

這個鏈接還是滿全面的 Java 中 Gson的使用 - 【cosmo】 - 博客園

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

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

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