一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|

服務(wù)器之家 - 編程語言 - JAVA教程 - Gson解析空字符串發(fā)生異常的處理方法

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

2020-06-30 11:31daisy JAVA教程

最近在一個項目中遇到一個問題,當(dāng)面對一些不規(guī)范的json,我們的gson解析經(jīng)常會拋出各種異常導(dǎo)致app崩潰,通過在網(wǎng)上查找資料,找到了原因,這篇文章給大家介紹了一些可以采取的措施來避免這種情況,有需要的朋友們可以一起來

前言

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

Json異常情況

先來看一個后臺返回的json

正常情況下json:

?
1
2
3
4
5
6
7
8
{
 "code":0,
 "msg":"ok",
 "data":{
  "id":5638,
  "newsId":5638
 }
}

data部分對應(yīng)的實體類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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字段未查詢到對應(yīng)數(shù)據(jù)):

?
1
2
3
4
5
6
7
8
{
 "code":0,
 "msg":"ok",
 "data":{
  "id":5638,
  "newsId":""
 }
}

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

json異常的處理

我們期望在后臺返回的json異常時,也能解析成功,空值對應(yīng)的轉(zhuǎn)換為默認(rèn)值,如:newsId=0;

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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=>

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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=>

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
 }
}

所以使用是這樣的:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
return new Retrofit.Builder()
  .client(okHttpClient)//設(shè)置網(wǎng)絡(luò)訪問框架
  .addConverterFactory(GsonConverterFactory.create(buildGson()))//添加json轉(zhuǎn)換框架
  .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字段為空的情況崩潰了

總結(jié)

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

延伸 · 閱讀

精彩推薦
  • JAVA教程Java并發(fā)編程示例(四):可控的線程中斷

    Java并發(fā)編程示例(四):可控的線程中斷

    這篇文章主要介紹了Java并發(fā)編程示例(四):可控的線程中斷,在本節(jié),我們將使用一個線程查找指定目錄及其子目錄下文件來演示通過使用InterruptedException異常...

    junjie2072019-12-06
  • JAVA教程簡析Java中的util.concurrent.Future接口

    簡析Java中的util.concurrent.Future接口

    這篇文章主要介紹了簡析Java中的util.concurrent.Future接口,作者把future歸結(jié)為在未來得到目標(biāo)對象的占位符,需要的朋友可以參考下 ...

    goldensun3032019-12-26
  • JAVA教程Java中Spring獲取bean方法小結(jié)

    Java中Spring獲取bean方法小結(jié)

    Spring是一個輕量級的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,如何在程序中獲取Spring配置的bean呢?下面通過本文給大家介紹Java中Spring獲取bean方法小...

    mrr4682020-03-21
  • JAVA教程舉例講解Java中do-while語句的使用方法

    舉例講解Java中do-while語句的使用方法

    這篇文章主要介紹了Java中do-while語句的使用方法例子,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下 ...

    goldensun2852020-01-13
  • JAVA教程淺談java封裝

    淺談java封裝

    封裝封裝就是將屬性私有化,提供公有的方法訪問私有的屬性。*實現(xiàn)封裝的步驟:(1)修改屬性的可見性來限制對屬性的訪問。(2)為每個屬性創(chuàng)建一對...

    hebedich3022019-12-13
  • JAVA教程Java基礎(chǔ)教程之包(package)

    Java基礎(chǔ)教程之包(package)

    這篇文章主要介紹了Java基礎(chǔ)教程之包(package),本文詳細(xì)講解了包的創(chuàng)建、使用等方法,需要的朋友可以參考下 ...

    junjie4162019-11-27
  • JAVA教程Java線程關(guān)閉的3種方法

    Java線程關(guān)閉的3種方法

    這篇文章介紹了Java線程關(guān)閉的3種方法,有需要的朋友可以參考一下 ...

    java技術(shù)網(wǎng)5682019-10-16
  • JAVA教程java利用Ant腳本生成war包全過程

    java利用Ant腳本生成war包全過程

    這篇文章主要為大家詳細(xì)介紹了java利用Ant腳本生成war包全過程,感興趣的朋友可以參考一下 ...

    ngulc3572020-04-08
主站蜘蛛池模板: 亚洲国产精品无码中文在线 | 韩国三级hd中文字幕李采潭 | 麻豆夏晴子| 亚洲视频99 | 国产一卡二卡四卡免费 | a级精品九九九大片免费看 a级动漫 | 亚洲成人aa | 男女男精品视频网站 | 亚欧毛片基地国产毛片基地 | 亚洲欧美国产精品久久久 | 青春草在线观看精品免费视频 | 日本96在线精品视频免费观看 | 操女人bb| 欧美专区亚洲 | 精品麻豆国产 | 非洲一级毛片又粗又长aaaa | 视频免费视频观看网站 | 国产毛片在线观看 | 精品无人区麻豆乱码1区2 | 精品视频手机在线观看免费 | 蜜桃视频一区二区 | 国产成人影院在线观看 | 日本a在线天堂 | 久久综合色超碰人人 | 日韩爱爱| 成人免费在线视频观看 | 天天综合色天天综合网 | 日本高清在线看免费观看 | 国产麻豆在线观看网站 | 免费在线影院 | 特级老女人淫片高清视频 | 精品国产日韩一区三区 | 精品国产自在现线拍400部 | 狠狠燥 | 欧美特级特黄a大片免费 | 办公室大战秘书呻吟 | 桃色导航| 亚洲精品国偷拍自产在线观看蜜臀 | 给我免费的视频在线观看 | 奇米9999| 日韩不卡一区二区三区 |