更多前沿课程:元宇宙:人类社会数字化转型(开学第一课)--机器学习视频教程-人工智能-CSDN程序员研修院

https://edu.csdn.net/course/detail/30449

SpringBoot2集成Quartz+Vue动态定时任务(前后分离)-quartz vue,springboot 动态定时任务,springboot2 动态定时任务-Java视频教程-后端开发-CSDN程序员研修院能独立完整体系化的Quartz真实项目 能使用cron表达式7子表达式进行动态任务处理 能独立完成springboot+quartz的整合,新增,运行,暂停,恢复,暂停,更新工作 能掌握快速高效的学习方法和学习技巧-quartz vue,springboot 动态定时任务,springboot2 动态定时任务正在上传…重新上传取消https://edu.csdn.net/course/detail/32104https://edu.csdn.net/course/detail/32104 SpringCloud+Oauth2+Vue+ElementUI前后端分离快速上手项目实战开发--Java视频教程-后端开发-CSDN程序员研修院一个学完能直接通用的微服务项目 一个能直接快速上手,节约学习成本和时间的实战项目 一个企业真实的脱敏后的项目 一个微服务组件协同的前后端分离项目实战教程-正在上传…重新上传取消https://edu.csdn.net/course/detail/29602https://edu.csdn.net/course/detail/29602​​​​​​​

ETL之PDI/Kettle9.x/8.x案例培训实战从入门到应用案例-Array-ETL视频教程-大数据-CSDN程序员研修院企业用的最多的Kettle9.x/8.x/7.x,本教程以最新Kettle 9.x进行教学 ETL推送技术开源免费软件排行榜首位的Kettle工具讲解 能独立完成Kettle数据推送项目 能独立进行数据清洗,数据推送,数据迁移工作-Array正在上传…重新上传取消https://edu.csdn.net/course/detail/31647https://edu.csdn.net/course/detail/31647
SpringCloud+Oauth2+Vue+ElementUI前后端分离快速上手项目实战开发--Java视频教程-后端开发-CSDN程序员研修院一个学完能直接通用的微服务项目 一个能直接快速上手,节约学习成本和时间的实战项目 一个企业真实的脱敏后的项目 一个微服务组件协同的前后端分离项目实战教程-正在上传…重新上传取消https://edu.csdn.net/course/detail/29602https://edu.csdn.net/course/detail/29602

面对一些不规范的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> {@Overridepublic Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)throws JsonParseException {try {if (json.getAsString().equals("") || json.getAsString().equals("null")) {//定义为int类型,如果后台返回""或者null,则返回0return 0;}} catch (Exception ignore) {}try {return json.getAsInt();} catch (NumberFormatException e) {throw new JsonSyntaxException(e);}}@Overridepublic JsonElement serialize(Integer src, Type typeOfSrc, JsonSerializationContext context) {return new JsonPrimitive(src);}
}

同理Long及Double类型

double=>

public class DoubleDefault0Adapter implements JsonSerializer<Double>, JsonDeserializer<Double> {@Overridepublic Double deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {try {if (json.getAsString().equals("") || json.getAsString().equals("null")) {//定义为double类型,如果后台返回""或者null,则返回0.00return 0.00;}} catch (Exception ignore) {}try {return json.getAsDouble();} catch (NumberFormatException e) {throw new JsonSyntaxException(e);}}@Overridepublic JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) {return new JsonPrimitive(src);}
}

long=>

public class LongDefault0Adapter implements JsonSerializer<Long>, JsonDeserializer<Long> {@Overridepublic Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)throws JsonParseException {try {if (json.getAsString().equals("") || json.getAsString().equals("null")) {//定义为long类型,如果后台返回""或者null,则返回0return 0l;}} catch (Exception ignore) {}try {return json.getAsLong();} catch (NumberFormatException e) {throw new JsonSyntaxException(e);}}@Overridepublic 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字段为空的情况崩溃了

作者:uncochen
链接:https://www.jianshu.com/p/e03a96f5a321
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Gson解析空字符串异常的处理相关推荐

  1. 试用Gson 解析json字符串

    1.传统的数据量非常小的json 数据,我们可以使用 JsonObject.JsonArray进行解析,从而可以从Server拿到需要的数据.但是对于Json数据量大.并且类型相对较多的情况下,如果还 ...

  2. Gson解析json字符串,并封装成ListT

    最近一个项目中,需要将从服务器上获取到的JSON字符串转换为对象,大概研究了一下,发现在项目中很多地方都要用到,而且有的时候需要返回的是一个集合,所以写了个方法,留着自用. public class ...

  3. java中gso是什么意思_Java中用Gson解析json字符串

    本文最后更新于2019年9月13日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢! =Start= 缘由: 因为阿里开源的fastjson前段时间爆出的漏洞实在是太多了(而且有些漏洞他 ...

  4. Android利用Gson解析Json数据

    其实,要创建和解析JSON数据,也可以使用GSON来完成.GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库.使用GSON,可以很容易的将一串JSON数据转换为一个 ...

  5. java map转json字符串_Java-Gso-json字符串解析-php后台返回字段类型可能为字符串(/空字符串)或者对象的情况...

    其实本来android前端定义的对象类型是对象,如果后台没有值的情况下,理论上给null,如果是数组给[]或者null都可以的.这样Gson再解析转换的时候就不会出问题!但是最近重构发现后台如果没有字 ...

  6. pandas使用read_csv函数读取文件并解析日期数据列(parse dates)、pandas使用read_csv函数读取文件并将缺失值转化为空字符串

    pandas使用read_csv函数读取文件并解析日期数据列(parse dates).pandas使用read_csv函数读取文件并将缺失值转化为空字符串 目录

  7. mybatis 解析Integer为0的属性,解析成空字符串

    使用Mybatis时,常常会判断属性是否为空 1 <if test="type != null and type != ''"> 2 and type = #{type ...

  8. 当类型设置为Integer时,传入的值为0,会将其转化为空字符串,从而造成查询数据异常

    今天在写一个普通的查询,条件查询状态为0时,查询总是异常,debug获取的参数都没问题,但查询后的结果是查询所有的数据 可以正常从前台获取数据: sql语句和代码写的都没毛病,后来仔细查阅了资料发现当 ...

  9. c# 解析json 字符串 报异常 Bad JSON escape sequence 解决方案

    c# 解析json 字符串 报异常 Bad JSON escape sequence 解决方案 参考文章: (1)c# 解析json 字符串 报异常 Bad JSON escape sequence ...

最新文章

  1. 嵌入式linux仪器,一种基于嵌入式Linux设备双系统的启动方法
  2. OCS2007安装配置指南
  3. iOS - 修改 UITextField 的 clearButtton 样式
  4. spring核心之IOC
  5. 最小路径和Python解法
  6. python--json pickle 模块
  7. 虚拟化技术之KVM安装与使用
  8. 程序员与代码的几种关系,每种都会被我们鄙视
  9. LeetCode 1247. 交换字符使得字符串相同
  10. 揭晓远程证明架构EAA:机密容器安全部署的最后一环 | 龙蜥技术
  11. dos输入java Hello,出现错误: 找不到或无法加载主类 Hello
  12. react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
  13. python中字典教程_python中字典详解
  14. 一键seo提交收录_百度、360快速收录新上线网站技巧、方法
  15. Mahalanobis(马哈拉诺比斯)距离
  16. layim之绑定未读消息数量
  17. 独立产品灵感周刊 DecoHack #029 - 随便逛逛谷歌街景
  18. springDataJpa @Query注解多条件动态模糊分页查询,传入形参对象
  19. unittest---unittest生成测试报告
  20. C++基础—缺省参数

热门文章

  1. 快门速度,光圈,感光度
  2. ios直播开发基础,推流协议及流程
  3. VMBox挂载共享文件时可能出现的问题以及对应的解决办法
  4. 视频文件顺时针旋转90度
  5. 京东模拟扫码登陆破解-爬虫
  6. android 日历翻页动画,datetimepicker一个不错的日历android特效
  7. Jupyter Notebook连接服务器失败
  8. linux 文本随机抽样_Linux命令总结
  9. [质因数分解]樱花 洛谷P1445
  10. C语言中,求三个数中最大数