> 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解析 异常相关推荐

  1. Android 12安装app失败,提示安装包解析异常

    Android 12安装编译出的debug版本app失败,提示安装包解析异常,在gradle.properties中添加 android.injected.testOnly=false 即可正常安装

  2. Android Study 之真正解决TextView字间距,那些扯淡的边儿去吧

    LZ-Says:从个人的角度来说为什么要写博客,一方面可以拓展知识,通过分享去了解更多的知识:二方面可以通过优质的博文去推广自己. 写博客,就好像工作一样,要认真,要对自己写的东西负责,更要对别人看的 ...

  3. android json解析异常,json数据解析异常而导致网络请求失败的解决办法(其一)

    问题概述 笔者在开发过程中临时遇到一个本来仅有web端的项目临时增加Android端,导致后端在出接口时并未考虑Android端的json数据的解析,导致接口是这样的.... 正确请求 { " ...

  4. Android Studio经验积累之常见问题以及解决方式

    原文出处--Android Studio经验积累 1.获取SHA1: Android Studio中获取sha1证书指纹数据的方法 2.注释模板:android studio中如何设置注释模板 3.A ...

  5. as3 android白屏,Android 8.0中一些坑以及对应的解决方法

    前言 虽然 Android 9.0 都已经面世了,本篇文章写的有点迟了. 但是迟到好过不到,因此基于此这边还是记录一下项目中遇到的 Android 8.0 的坑及对应解决方法. 每次系统升级,虽然系统 ...

  6. 转: Android ListView 滑动背景为黑色的解决办法

    2019独角兽企业重金招聘Python工程师标准>>> 在Android中,ListView是最常用的一个控件,在做UI设计的时候,很多人希望能够改变一下它的背景,使他能够符合整体的 ...

  7. android 置灰不可点击,Android Studio 运行按钮灰色的完美解决方法

    Android Studio 运行按钮灰色的完美解决方法 今天新建项目的时候突然发现编译后运行按钮为灰色. 解决方案:第一步:点击图中的Add Configuration,出来如下界面 第二步:点+号 ...

  8. android 自定义actionbar前面有一块空白,解决Android V7后自定义Toolbar、ActionBar左侧有空白问题...

    如图所示: 1.查看Wiget.AppCompat.Toolbar的parent主题,如下所示: @style/TextAppearance.Widget.AppCompat.Toolbar.Titl ...

  9. Android软键盘隐藏,遮挡EidtText解决办法

    一.自动弹出软键盘 Timer timer=new Timer(); timer.schedule(new TimerTask() { public void run() { InputMethodM ...

最新文章

  1. Apache Kafka-max.poll.interval.ms参数含义说明
  2. Json和XML之间的对比
  3. 解决问题E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录,
  4. SVN数据代码迁移Windows2012ServerR2
  5. 埃夫特机器人示教器keba_埃夫特下一代智能工业机器人研发及产业化项目奠基...
  6. 计算机操作系统》第06章在线测试,《计算机操作系统》第01章在线测试
  7. fastjson反序列化map_最新fastjson反序列化漏洞分析
  8. 【Best Time to Buy and Sell Stock II】cpp
  9. Ubuntu U盘启动出现“Failed to load ldlinux.c32”解决
  10. 2.74-写出具有如下原型的函数的代码:
  11. 学生开源项目_大学如何利用开源吸引学生
  12. 输出“A、B...Z、AA、AB...AZ、BA、BB...BZ.......”的结构
  13. VS-Code安装C++安装教程
  14. 2020-2021 ICPC - Gran Premio de Mexico - Repechaje
  15. Android 如何OTG 鼠标,otg键盘和鼠标映射软件v5.2.0 Android版
  16. T13656 NOI接站
  17. 【coolshell酷壳】你可能不知道的Shell
  18. CentOS7挂载磁盘,4T磁盘挂载方法
  19. 身份证号校验(极简版)
  20. android应用资源预编译,编译和打包全解析

热门文章

  1. 转:接班人都是“剩出来”的,选接班人9条必用原则
  2. STM32F103c8t6超频
  3. Pepper机器人的背后,孙正义的情怀和梦想
  4. Contour 学习笔记(一):使用 Contour 接管 Kubernetes 的南北流量
  5. 入行3D建模需不需要美术绘画?不看吃亏的是你!
  6. YARN集群的mapreduce测试(一)
  7. android 裁剪屏幕中特定区域内的内容
  8. P2394 yyy loves Chemistry I
  9. 一位人工智能总监对 AI 行业的【实话实说】
  10. matlab用方程的解赋值,Matlab隐式符号方程求解和赋值