一、背景:
使用REST接口接收遠端傳送過來的Json格式String,需要把這個String序列化成響應的對象。
二、問題:
對方封裝了一個錯誤的json格式過來,程序就掛了……
三、似乎解決:
通過外交手段嚴令對方封裝標准的json格式字符串,看起來測試又通過了……
四、反思:
這樣肯定是不行的,實際上線以后,萬一有人惡意的往接口發一條錯誤的String來,程序就掛了也說不過去啊。
我在寫代碼的時候沒有收到處理exception的提示,說明這是一個“不可查異常”,例如RuntimeException。
那就捕獲這個異常並處理就好了。
五、徹底解決:
先看看原有的轉換方法:
1 public <T> T GsonToBean(String gsonString, Class<T> cls) { 2 T t = null; 3 if (gson != null) { 4 t = gson.fromJson(gsonString, cls); 5 } 6 return t; 7 }
跟蹤一下fromJson方法
1 public <T> T fromJson(String json, Class<T> classOfT) throws JsonSyntaxException { 2 Object object = fromJson(json, (Type) classOfT); 3 return Primitives.wrap(classOfT).cast(object); 4 }
這個方法拋出了一個JsonSyntaxException
那就捕獲吧!
改進的轉換方法:
public <T> T GsonToBean(String gsonString, Class<T> cls) { T t = null; if (gson != null) { try { t = gson.fromJson(gsonString, cls); } catch (JsonSyntaxException e) { System.out.println("json parse err!!!"); } } return t; }
bingo!任你傳什么格式的String,程序都不會掛了。我得到了一句打印"json parse err!!!"
如果你不想在這個方法中處理這個exception,想在更上層的業務邏輯中處理它,那就throws吧。
1 public <T> T GsonToBean(String gsonString, Class<T> cls) throws JsonSyntaxException { 2 T t = null; 3 if (gson != null) { 4 t = gson.fromJson(gsonString, cls); 5 } 6 return t; 7 }