Gson解析空字符串异常的处理
来源:互联网 发布:女神联盟2战宠进阶数据 编辑:程序博客网 时间:2024/05/02 22:38
面对一些不规范的json,我们的gson解析经常会抛出各种异常导致app崩溃,这里可以采取一些措施来避免
关于数组类型的字段解析异常,我尝试了一些方案,但最后都存在问题,如果大家有好的解决方案,希望能贴在下面.不甚感激.
异常示例=>正常json:
{ "code":0, "msg":"ok", "data":[ //约定为数组 { "id":5638, "newsId":5638 } ]}
异常json:
{ "code":0, "msg":"ok", "data":{} //返回为对象或者空字符串}
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(后台数据库newsId字段未查询到对应数据):
{ "code":0, "msg":"ok", "data":{ "id":5638, "newsId":"" }}
这样Gson在解析时就会抛出解析错误的异常,app崩溃,原因是无法将""转化为int
json异常的处理
我们期望在后台返回的json异常时,也能解析成功,空值对应的转换为默认值,如:newsId=0;
这里排除掉后台开发人员输出时给你做矫正,还是得靠自己啊---
我们写一个针对int值的类型转换器,需要实现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)//设置网络访问框架 .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字段为空的情况崩溃了
0 0
- Gson解析空字符串异常的处理
- Retrofit Gson解析空字符串的问题
- Retrofit Gson解析空字符串的问题
- Gson&FastJson解析异常Json的处理
- Gson解析null替换为空字符串
- Gson解析null替换为空字符串
- Gson解析null替换为空字符串
- Gson解析null替换为空字符串
- Gson解析null替换为空字符串
- Gson自定义适配器处理特殊解析异常
- Gson解析或者转换对象成json字符串时,String为NULL转空字符串处理方案
- Retrofit+RxJava实战日志(4)-Gson解析空字符串的问题
- C# 空异常的处理
- 用Gson解析复杂的Json字符串
- gson 的使用 解析json字符串
- 异步和gson解析字符串的方法
- Google的GSON处理JSON解析
- android 用gson解析json的时候报空指针
- 1098. Insertion or Heap Sort (25)解题报告
- How Can I Get 300 Mbps (or Higher) Speed on My 802.11n Network?
- spring-loaded 实现web项目热部署
- BaseSerializableData
- isql连接本地数据库和远程数据库(sybase)
- Gson解析空字符串异常的处理
- HttpClient 4.3超时设置
- 谈谈你对Spring框架的理解
- google地图 自定义infowindow infobox.js 插件
- 数据通信基础
- Java遍历集合的几种方法分析(实现原理、算法性能、适用场合)
- Openstack Swift 组件搭建成功后,重启机器失败的解决方案
- Mybatis3 if判断字符串变态了
- Java环境配置