先扯兩句
寫代碼嗎,大多數(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é)果:

有了這個嘗試,是不是可以多玩點(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)站沙沙野