先扯兩句
寫代碼嗎,大多數情況下還是追求個準確性,可老頭子我卻總想着玩的邪的(總不能說是與後臺約定好了接口文檔,結果他們沒按格式傳吧,會捱揍的)。怎麼判斷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
鳴謝:圖片提供網站沙沙野