來(lái)自服務(wù)器的無(wú)效JSON應(yīng)該始終是預(yù)期的用例。在傳輸過(guò)程中,有一百萬(wàn)件事情會(huì)出錯(cuò)。GSON有點(diǎn)棘手,因?yàn)樗腻e(cuò)誤輸出會(huì)給您帶來(lái)一個(gè)問(wèn)題,您捕獲的實(shí)際異常將是另一種類型。
考慮到所有這些,客戶端的正確修復(fù)方法是
try{
gson.fromJSON(ad, Ad.class);
//...}catch (IllegalStateException | JsonSyntaxException exception){
//...
如果您想知道從服務(wù)器收到的JSON錯(cuò)誤的原因,可以在CATCH塊內(nèi)部查看異常。但是,即使這是你的問(wèn)題,也不是客戶從互聯(lián)網(wǎng)上收到的修復(fù)JSON的責(zé)任。
無(wú)論哪種方式,當(dāng)它得到壞的JSON時(shí),客戶端都有責(zé)任決定該做什么。有兩種可能性是拒絕JSON,什么也不做,然后再試一次。
如果要再次嘗試,我強(qiáng)烈建議在try/catch塊內(nèi)設(shè)置一個(gè)標(biāo)志,然后在try/catch塊之外響應(yīng)該標(biāo)志。嵌套TRY/CATCH很可能是gson使我們陷入這種混亂的堆棧跟蹤和異常不匹配的原因。
換句話說(shuō),即使我承認(rèn)它看起來(lái)不太優(yōu)雅,我還是建議
boolean failed = false;try{
gson.fromJSON(ad, Ad.class);
//...}catch (IllegalStateException | JsonSyntaxException exception){
failed = true;
//...}if (failed){
//...