Android 知識點——當json傳入字符串,使用Boolean接收時,GSON會將其轉換爲false

先扯兩句

寫代碼嗎,大多數情況下還是追求個準確性,可老頭子我卻總想着玩的邪的(總不能說是與後臺約定好了接口文檔,結果他們沒按格式傳吧,會捱揍的)。怎麼判斷boolean的都是false,抓一下接口
憤怒
經過我們友善的溝通,以及付出了兩根排骨的代價後,終於成功讓後臺改了接口,不過還是有所收穫的,那就是知道了Gson將String轉換爲boolean時是不會報錯的,特此記錄一下。

下面給大家展示個神器,叫Android知識點——目錄,好了,閒言少敘,下面進入正題。

正文

	@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("轉換成功   aBoolean = " + change.aBoolean + " ******* string = " + change.string);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

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

可以看到我們用於接收的對象爲MyChange,其中的參數 string賦予默認值true,但是在創建的JSONObject 對象中,傳入的string,確實“hasController”,一個純種的字符串。通過Gson轉換後,並沒有想象中的報出JSONException,反而能夠正常輸出結果:
結果
有了這個嘗試,是不是可以多玩點好玩的呢?

	@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("轉換成功   \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(別問我爲什麼用“老子”,沒看人家已經大寫了嗎),之後又若若的試了一下long,得到的還是相同的結果,一片血紅啊!
但是,這就想嚇退老頭子我嗎?那是不可能的,別的不行,但是作死的道路上,必須有我的大腳印,於是就有了這段代碼:

	@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("轉換成功   \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 {

    }

直接上最負責的java對象試試會是什麼結果。
成功了

結論

經測試,除數值的基本類型,其他的類型轉換爲boolean不會報錯,但是都會被轉換爲false。

PS:如果熟悉Android Junit的朋友可能已經看出來了,這裏使用的代碼單元測試工具正式Junit中的java test工具,但是如果直接複製代碼在自己的Junit中跑很可能會看到如下錯誤:
在這裏插入圖片描述
解決這個問題可以查看:Android 知識點——Method put in org.json.JSONObject not mocked

鳴謝:圖片提供網站沙沙野

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章