android gson工具包,Android Study 之 彻底解决 Gson解析 异常
> LZ-Say:大风呼呼的刮,就好像妖精要来的前奏一样~
>
>
前言
开发过程中,App常用的接收参数的时候,几乎大部分都是以json格式为主,那么有关解析json的方式有很多,Android端相对来说使用Gson比较多,而在解析过程中,如果你遇到规范的后台,那你大可放心随便浪,But,如果遇到神后台,那么,呵呵了你就。真的想不到还会出现什么问题。。。
描述问题
实现某个功能,调用某个接口,返回如下参数:{ "areaName": null, "accountId": 138, "accountName": null, "accountNumber": null, "msgCode": "", "msg": "", "pname": "赵九胜", "nation": "19701010", "imgUri": null, "phone": "15831345807", "areaCode": "230303", "usedTime": null, "collectionWay": 1, "registTime": null, "createTime": "2017-10-26 06:46:23", "amount": 580, "price": 0, "certificates": null, "certificatesPhotos": null}
大家仔细观察下,咋眼一看,也没啥问题是不?
可在解析的过程中,GG了。。。
趟坑路,超神路
满怀信心的撸码,运行,app却提示了如下类型错误:
> com.google.gson.JsonSyntaxException
上来一看,Json格式错误?回头再仔细看下返回的Json。
有的值为null,有的值为“”
重点结合度娘的意见以及重新回顾Json串时,确定了是由于后台接口参数返回不规范(也就是设计不合理)导致解析失败。那么怎么解决呢?
其实说白了,就是在转化解析的过程中对后台返回Json中不合法的属性字段进行有效处理即可。具体直接看下面工具类即可。import com.google.gson.Gson;import com.google.gson.GsonBuilder;import com.google.gson.TypeAdapter;import com.google.gson.internal.LinkedTreeMap;import com.google.gson.reflect.TypeToken;import com.google.gson.stream.JsonReader;import com.google.gson.stream.JsonToken;import com.google.gson.stream.JsonWriter;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.Map;public class GsonUtil { /**
* 实现格式化的时间字符串转时间对象
*/
private static final String DATEFORMAT_default = "yyyy-MM-dd HH:mm:ss"; /**
* 使用默认的gson对象进行反序列化
*
* @param json
* @param typeToken
* @return
*/
public static T fromJsonDefault(String json, TypeToken typeToken) {
Gson gson = new Gson(); return gson.fromJson(json, typeToken.getType());
} /**
* json字符串转list或者map
*
* @param json
* @param typeToken
* @return
*/
public static T fromJson(String json, TypeToken typeToken) {
Gson gson = new GsonBuilder() // 重写map的反序列化
.registerTypeAdapter(new TypeToken<Map>() {
}.getType(), new MapTypeAdapter()).create(); return gson.fromJson(json, typeToken.getType());
} /**
* json字符串转bean对象
*
* @param json
* @param cls
* @return
*/
public static T fromJson(String json, Class cls) {
Gson gson = new GsonBuilder().setDateFormat(DATEFORMAT_default)
.create(); return gson.fromJson(json, cls);
} /**
* 对象转json
*
* @param obj
* @param format
* @return
*/
public static String toJson(Object obj, boolean format) {
GsonBuilder gsonBuilder = new GsonBuilder(); // 设置默认时间格式
gsonBuilder.setDateFormat(DATEFORMAT_default); // 添加格式化设置
if (format) {
gsonBuilder.setPrettyPrinting();
}
Gson gson = gsonBuilder.create(); return gson.toJson(obj);
} public static class MapTypeAdapter extends TypeAdapter { @Override
public Object read(JsonReader in) throws IOException {
JsonToken token = in.peek(); switch (token) { case BEGIN_ARRAY:
List list = new ArrayList();
in.beginArray(); while (in.hasNext()) {
list.add(read(in));
}
in.endArray(); return list; case BEGIN_OBJECT:
Map map = new LinkedTreeMap();
in.beginObject(); while (in.hasNext()) {
map.put(in.nextName(), read(in));
}
in.endObject(); return map; case STRING: return in.nextString(); case NUMBER: // 改写数字的处理逻辑,将数字值分为整型与浮点型。
double dbNum = in.nextDouble(); // 数字超过long的最大值,返回浮点类型
if (dbNum > Long.MAX_VALUE) { return dbNum;
} // 判断数字是否为整数值
long lngNum = (long) dbNum; if (dbNum == lngNum) { return lngNum;
} else { return dbNum;
} case BOOLEAN: return in.nextBoolean(); case NULL:
in.nextNull(); return null; default: throw new IllegalStateException();
}
} @Override
public void write(JsonWriter out, Object value) throws IOException { // 序列化无需实现
}
}
}
调用方式如下:List resultBean = GsonUtil.fromJson(
GsonUtil.toJson(result.getData(), true), // 这里需要将获取到的json再次进行格式化
new TypeToken<List>() {
});
结束
其实 度娘有度娘的好处
开发者 好多包括LZ 都是属于“百度开发者”但是这点并没有什么可傲娇的
能做的 就是在前行的路上 不断充实自己 加油 各位伙计们
android gson工具包,Android Study 之 彻底解决 Gson解析 异常相关推荐
- Android 12安装app失败,提示安装包解析异常
Android 12安装编译出的debug版本app失败,提示安装包解析异常,在gradle.properties中添加 android.injected.testOnly=false 即可正常安装
- Android Study 之真正解决TextView字间距,那些扯淡的边儿去吧
LZ-Says:从个人的角度来说为什么要写博客,一方面可以拓展知识,通过分享去了解更多的知识:二方面可以通过优质的博文去推广自己. 写博客,就好像工作一样,要认真,要对自己写的东西负责,更要对别人看的 ...
- android json解析异常,json数据解析异常而导致网络请求失败的解决办法(其一)
问题概述 笔者在开发过程中临时遇到一个本来仅有web端的项目临时增加Android端,导致后端在出接口时并未考虑Android端的json数据的解析,导致接口是这样的.... 正确请求 { " ...
- Android Studio经验积累之常见问题以及解决方式
原文出处--Android Studio经验积累 1.获取SHA1: Android Studio中获取sha1证书指纹数据的方法 2.注释模板:android studio中如何设置注释模板 3.A ...
- as3 android白屏,Android 8.0中一些坑以及对应的解决方法
前言 虽然 Android 9.0 都已经面世了,本篇文章写的有点迟了. 但是迟到好过不到,因此基于此这边还是记录一下项目中遇到的 Android 8.0 的坑及对应解决方法. 每次系统升级,虽然系统 ...
- 转: Android ListView 滑动背景为黑色的解决办法
2019独角兽企业重金招聘Python工程师标准>>> 在Android中,ListView是最常用的一个控件,在做UI设计的时候,很多人希望能够改变一下它的背景,使他能够符合整体的 ...
- android 置灰不可点击,Android Studio 运行按钮灰色的完美解决方法
Android Studio 运行按钮灰色的完美解决方法 今天新建项目的时候突然发现编译后运行按钮为灰色. 解决方案:第一步:点击图中的Add Configuration,出来如下界面 第二步:点+号 ...
- android 自定义actionbar前面有一块空白,解决Android V7后自定义Toolbar、ActionBar左侧有空白问题...
如图所示: 1.查看Wiget.AppCompat.Toolbar的parent主题,如下所示: @style/TextAppearance.Widget.AppCompat.Toolbar.Titl ...
- Android软键盘隐藏,遮挡EidtText解决办法
一.自动弹出软键盘 Timer timer=new Timer(); timer.schedule(new TimerTask() { public void run() { InputMethodM ...
最新文章
- Apache Kafka-max.poll.interval.ms参数含义说明
- Json和XML之间的对比
- 解决问题E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录,
- SVN数据代码迁移Windows2012ServerR2
- 埃夫特机器人示教器keba_埃夫特下一代智能工业机器人研发及产业化项目奠基...
- 计算机操作系统》第06章在线测试,《计算机操作系统》第01章在线测试
- fastjson反序列化map_最新fastjson反序列化漏洞分析
- 【Best Time to Buy and Sell Stock II】cpp
- Ubuntu U盘启动出现“Failed to load ldlinux.c32”解决
- 2.74-写出具有如下原型的函数的代码:
- 学生开源项目_大学如何利用开源吸引学生
- 输出“A、B...Z、AA、AB...AZ、BA、BB...BZ.......”的结构
- VS-Code安装C++安装教程
- 2020-2021 ICPC - Gran Premio de Mexico - Repechaje
- Android 如何OTG 鼠标,otg键盘和鼠标映射软件v5.2.0 Android版
- T13656 NOI接站
- 【coolshell酷壳】你可能不知道的Shell
- CentOS7挂载磁盘,4T磁盘挂载方法
- 身份证号校验(极简版)
- android应用资源预编译,编译和打包全解析