亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Gson解析空字符串發(fā)生異常的處理方法

 更新時間:2016年11月05日 08:40:56   投稿:daisy  
最近在一個項目中遇到一個問題,當面對一些不規(guī)范的json,我們的gson解析經(jīng)常會拋出各種異常導致app崩潰,通過在網(wǎng)上查找資料,找到了原因,這篇文章給大家介紹了一些可以采取的措施來避免這種情況,有需要的朋友們可以一起來學習學習。

前言

在實際開發(fā)項目中,服務器經(jīng)常會用空字符串 “” 作為返回結果表示空值 ,但這在Gson當中就會遇到問題,如果這項數(shù)據(jù)的類型不是字符串,Gson解析就會報錯

Json異常情況

先來看一個后臺返回的json

正常情況下json:

{
 "code":0,
 "msg":"ok",
 "data":{
  "id":5638,
  "newsId":5638
 }
}

data部分對應的實體類:

public class JsonBean {
 private int id;
 private int newsId;

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public int getNewsId() {
  return newsId;
 }

 public void setNewsId(int newsId) {
  this.newsId = newsId;
 }
}

異常情況json(后臺數(shù)據(jù)庫newsId字段未查詢到對應數(shù)據(jù)):

{
 "code":0,
 "msg":"ok",
 "data":{
  "id":5638,
  "newsId":""
 }
}

這樣Gson在解析時就會拋出解析錯誤的異常,app崩潰,原因是無法將""轉化為int

json異常的處理

我們期望在后臺返回的json異常時,也能解析成功,空值對應的轉換為默認值,如:newsId=0;

這里排除掉后臺開發(fā)人員輸出時給你做矯正,還是得靠自己啊---

我們寫一個針對int值的類型轉換器,需要實現(xiàn)Gson的 JsonSerializer<T> 接口和 JsonDeserializer<T> ,即序列化和反序列化接口

public class IntegerDefault0Adapter implements JsonSerializer<Integer>, JsonDeserializer<Integer> {
 @Override
 public Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
   throws JsonParseException {
  try {
   if (json.getAsString().equals("") || json.getAsString().equals("null")) {//定義為int類型,如果后臺返回""或者null,則返回0
    return 0;
   }
  } catch (Exception ignore) {
  }
  try {
   return json.getAsInt();
  } catch (NumberFormatException e) {
   throw new JsonSyntaxException(e);
  }
 }

 @Override
 public JsonElement serialize(Integer src, Type typeOfSrc, JsonSerializationContext context) {
  return new JsonPrimitive(src);
 }
}

同理Long及Double類型

double=>

public class DoubleDefault0Adapter implements JsonSerializer<Double>, JsonDeserializer<Double> {
 @Override
 public Double deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
  try {
   if (json.getAsString().equals("") || json.getAsString().equals("null")) {//定義為double類型,如果后臺返回""或者null,則返回0.00
    return 0.00;
  }
   } catch (Exception ignore) {
  }
  try {
   return json.getAsDouble();
  } catch (NumberFormatException e) {
   throw new JsonSyntaxException(e);
  }
 }

 @Override
 public JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) {
  return new JsonPrimitive(src);
 }
}

long=>

public class LongDefault0Adapter implements JsonSerializer<Long>, JsonDeserializer<Long> {
 @Override
 public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
  throws JsonParseException {
  try {
   if (json.getAsString().equals("") || json.getAsString().equals("null")) {//定義為long類型,如果后臺返回""或者null,則返回0
     return 0l;
    }
   } catch (Exception ignore) {
  }
  try {
   return json.getAsLong();
  } catch (NumberFormatException e) {
   throw new JsonSyntaxException(e);
  }
 }

 @Override
 public JsonElement serialize(Long src, Type typeOfSrc, JsonSerializationContext context) {
  return new JsonPrimitive(src);
 }
}

所以使用是這樣的:

return new Retrofit.Builder()
  .client(okHttpClient)//設置網(wǎng)絡訪問框架
  .addConverterFactory(GsonConverterFactory.create(buildGson()))//添加json轉換框架
  .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//讓Retrofit支持RxJava
  .baseUrl(baseUrl)
  .build();

/**
 * 增加后臺返回""和"null"的處理
 * 1.int=>0
 * 2.double=>0.00
 * 3.long=>0L
 *
 * @return
 */
public static Gson buildGson() {
 if (gson == null) {
  gson = new GsonBuilder()
    .registerTypeAdapter(Integer.class, new IntegerDefault0Adapter())
    .registerTypeAdapter(int.class, new IntegerDefault0Adapter())
    .registerTypeAdapter(Double.class, new DoubleDefault0Adapter())
    .registerTypeAdapter(double.class, new DoubleDefault0Adapter())
    .registerTypeAdapter(Long.class, new LongDefault0Adapter())
    .registerTypeAdapter(long.class, new LongDefault0Adapter())
    .create();
 }
 return gson;
}

再也不會因為后臺json字段為空的情況崩潰了

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能有所幫助,如果有疑問大家可以留言交流。

相關文章

  • Java利用正則表達式提取數(shù)據(jù)的方法

    Java利用正則表達式提取數(shù)據(jù)的方法

    最近由于項目需求需要提取txt里的數(shù)據(jù),之前用C#實現(xiàn)過,由于最近學習了java,所以嘗試用java實現(xiàn)下,這篇文章主要介紹了Java利用正則表達式提取數(shù)據(jù)的方法,需要的朋友可以參考下,下面來一起看看吧。
    2016-12-12
  • 郵件收發(fā)原理你了解嗎? 郵件發(fā)送基本過程與概念詳解(一)

    郵件收發(fā)原理你了解嗎? 郵件發(fā)送基本過程與概念詳解(一)

    你真的了解郵件收發(fā)原理嗎?這篇文章主要為大家詳細介紹了郵件發(fā)送基本過程與概念,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • spring?cloud?配置阿里數(shù)據(jù)庫連接池?druid的示例代碼

    spring?cloud?配置阿里數(shù)據(jù)庫連接池?druid的示例代碼

    這篇文章主要介紹了spring?cloud?配置阿里數(shù)據(jù)庫連接池?druid,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • Spring中MVC模塊代碼詳解

    Spring中MVC模塊代碼詳解

    這篇文章主要介紹了Spring中MVC模塊代碼詳解,涉及Controller的簡單介紹,具有一定借鑒價值,需要的朋友可以參考下。
    2017-11-11
  • 淺談使用Maven插件構建Docker鏡像的方法

    淺談使用Maven插件構建Docker鏡像的方法

    本篇文章主要介紹了淺談使用Maven插件構建Docker鏡像的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 使用Swagger直接上傳文件的方法

    使用Swagger直接上傳文件的方法

    這篇文章主要介紹了使用Swagger直接上傳文件的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • java簡單列出文件夾下所有文件的方法

    java簡單列出文件夾下所有文件的方法

    這篇文章主要介紹了java簡單列出文件夾下所有文件的方法,涉及java針對文件夾遍歷操作相關技巧,需要的朋友可以參考下
    2016-08-08
  • Feign遠程調(diào)用參數(shù)里面內(nèi)容丟失的解決方案

    Feign遠程調(diào)用參數(shù)里面內(nèi)容丟失的解決方案

    這篇文章主要介紹了Feign遠程調(diào)用參數(shù)里面內(nèi)容丟失的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Windows下如何安裝配置Redis環(huán)境

    Windows下如何安裝配置Redis環(huán)境

    這篇文章主要介紹了Windows下如何安裝配置Redis環(huán)境,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • Java?數(shù)據(jù)結構深入理解ArrayList與順序表

    Java?數(shù)據(jù)結構深入理解ArrayList與順序表

    ArrayList?類是一個可以動態(tài)修改的數(shù)組,與普通數(shù)組的區(qū)別就是它是沒有固定大小的限制,我們可以添加或刪除元素。ArrayList?繼承了?AbstractList?,并實現(xiàn)了?List?接口,順序表是將元素順序地存放在一塊連續(xù)的存儲區(qū)里,元素間的順序關系由它們的存儲順序自然表示
    2022-04-04

最新評論