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

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

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

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

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

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

  class com.google.gson.internal.LinkedTreeMap

也就是一個(gè)hashmap的一種類型语稠,這個(gè)時(shí)候就不是你說的對象了纺荧。那怎么辦?一種情況是颅筋,你判斷下如果是這種類型的話宙暇,如下操作:

先把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è)構(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ù)有很大幫助。小萌新的之前封裝的目前來用還是不錯(cuò)蒋歌。。但是今天又接觸了一些Gson的東西后堂油,還可以再完善下.....當(dāng)然還得多向好的第三方庫學(xué)習(xí).....

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市称诗,隨后出現(xiàn)的幾起案子萍悴,更是在濱河造成了極大的恐慌,老刑警劉巖寓免,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癣诱,死亡現(xiàn)場離奇詭異,居然都是意外死亡袜香,警方通過查閱死者的電腦和手機(jī)撕予,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜈首,“玉大人实抡,你說我怎么就攤上這事』恫撸” “怎么了吆寨?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長踩寇。 經(jīng)常有香客問我啄清,道長,這世上最難降的妖魔是什么俺孙? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任辣卒,我火速辦了婚禮掷贾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荣茫。我一直安慰自己想帅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布啡莉。 她就那樣靜靜地躺著港准,像睡著了一般。 火紅的嫁衣襯著肌膚如雪票罐。 梳的紋絲不亂的頭發(fā)上叉趣,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天泞边,我揣著相機(jī)與錄音该押,去河邊找鬼。 笑死阵谚,一個(gè)胖子當(dāng)著我的面吹牛蚕礼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梢什,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼奠蹬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嗡午?” 一聲冷哼從身側(cè)響起囤躁,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荔睹,沒想到半個(gè)月后狸演,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡僻他,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年宵距,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吨拗。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖劝篷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兔跌,我是刑警寧澤峡蟋,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布华望,位于F島的核電站赖舟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宾抓。R本人自食惡果不足惜豫喧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望讲衫。 院中可真熱鬧孵班,春花似錦、人聲如沸篙程。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氮发。三九已至,卻和暖如春宾娜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背前塔。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工华弓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寂屏。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓迁霎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親考廉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容