json字符串序列化exception處理


一、背景:

使用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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM