Android 知識點(diǎn)——當(dāng)json傳入字符串,使用Boolean接收時,GSON會將其轉(zhuǎn)換為false

先扯兩句

寫代碼嗎,大多數(shù)情況下還是追求個準(zhǔn)確性,可小老兒我卻總想著玩的邪的(總不能說是與后臺約定好了接口文檔,結(jié)果他們沒按格式傳吧,會挨揍的)。怎么判斷boolean的都是false,抓一下接口
[圖片上傳失敗...(image-db85ff-1573309702095)]
經(jīng)過我們友善的溝通,以及付出了兩根排骨的代價后,終于成功讓后臺改了接口,不過還是有所收獲的,那就是知道了Gson將String轉(zhuǎn)換為boolean時是不會報錯的,特此記錄一下。

下面給大家展示個神器,叫附錄——目錄,好了,閑言少敘,下面進(jìn)入正題。

正文

    @Test
    public void jsonTest() {
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("aBoolean", true);
            jsonObject.put("string", "hasController");

            MyChange change = new Gson().fromJson(jsonObject.toString(), MyChange.class);
            System.out.println("轉(zhuǎn)換成功   aBoolean = " + change.aBoolean + " ******* string = " + change.string);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public class MyChange {
        boolean aBoolean;
        boolean string = true;
    }

可以看到我們用于接收的對象為MyChange,其中的參數(shù) string賦予默認(rèn)值true,但是在創(chuàng)建的JSONObject 對象中,傳入的string,確實(shí)“hasController”,一個純種的字符串。通過Gson轉(zhuǎn)換后,并沒有想象中的報出JSONException,反而能夠正常輸出結(jié)果:


結(jié)果

有了這個嘗試,是不是可以多玩點(diǎn)好玩的呢?

    @Test
    public void jsonTest() {
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("aBoolean", true);
            jsonObject.put("string", "hasController");
            jsonObject.put("int0", 0);

            MyChange change = new Gson().fromJson(jsonObject.toString(), MyChange.class);
            System.out.println("轉(zhuǎn)換成功   \n****************************\naBoolean = " + change.aBoolean
                    + " \nstring = " + change.string
                    + " \nint0 = " + change.int0
                    + "\n****************************");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public class MyChange {
        boolean aBoolean;
        boolean string = true;
        boolean int0 = true;
    }

可惜很遺憾,這次Gson竟然失敗了~~~


失敗

文字翻譯過來就是老子想要bean,你卻給老子個NUMBER(別問我為什么用“老子”,沒看人家已經(jīng)大寫了嗎),之后又若若的試了一下long,得到的還是相同的結(jié)果,一片血紅??!
但是,這就想嚇退小老兒我嗎?那是不可能的,別的不行,但是作死的道路上,必須有我的大腳印,于是就有了這段代碼:

    @Test
    public void jsonTest() {
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("aBoolean", true);
            jsonObject.put("string", "hasController");
            jsonObject.put("param", new Param());

            MyChange change = new Gson().fromJson(jsonObject.toString(), MyChange.class);
            System.out.println("轉(zhuǎn)換成功   \n****************************\naBoolean = " + change.aBoolean
                    + " \nstring = " + change.string
                    + " \nparam = " + change.param
                    + "\n****************************");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public class MyChange {
        boolean aBoolean;
        boolean string = true;
        boolean param = true;
    }

    private class Param {

    }

直接上最負(fù)責(zé)的java對象試試會是什么結(jié)果。


成功了

結(jié)論

經(jīng)測試,除數(shù)值的基本類型,其他的類型轉(zhuǎn)換為boolean不會報錯,但是都會被轉(zhuǎn)換為false。

PS:如果熟悉Android Junit的朋友可能已經(jīng)看出來了,這里使用的代碼單元測試工具正式Junit中的java test工具,但是如果直接復(fù)制代碼在自己的Junit中跑很可能會看到如下錯誤:

在這里插入圖片描述

解決這個問題可以查看:Android 知識點(diǎn)——Method put in org.json.JSONObject not mocked

鳴謝:圖片提供網(wǎng)站沙沙野

最后編輯于
?著作權(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)容