此前一直都没遇到也一直相信服务端返回的json数据基本是正确的,直到我们的android端一直崩溃,并在友盟上查到一直报如下的错误:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:200)
at com.google.gson.Gson.fromJson(Gson.java:810)
at com.google.gson.Gson.fromJson(Gson.java:775)
at com.google.gson.Gson.fromJson(Gson.java:724)
at com.google.gson.Gson.fromJson(Gson.java:696)
at com.hjwang.netdoctor.c.a.a(CheckVersionHelper.java:65)
at com.hjwang.netdoctor.d.m.a(HttpRequestAsyncTask.java:54)
at com.hjwang.netdoctor.d.m.onPostExecute(HttpRequestAsyncTask.java:17)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5371)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:387)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:189)
... 18 more

第一行第一列报错,而且要命的是不是必现的,找到服务端的开发人员,他们也找不出来原因,更要命的是从表象看来确实是android客户端时不时的崩溃,一切的矛头全部指向了android开发人员。

为了暂时规避这个问题并且找出服务端的错误(真正的错误源头)我加入了保护措施。先看看我们的json数据形式:


{
"sessionId": "j3demrb6pbs04jmf12kfp25332",
"result": true,
"code": "",
"error": "",
"data": {
"addrId": "13",
"emId": "5223",
"regionId": "4002",
"region": "黑龙江 齐齐哈哈 铁锋区",
"receiver": "加隆",
"receiverPhone": "5555",
"address": "南纺织路9号"
}
}

result代表返回的结果,这个我们后面会用到,data代表每个接口所返回的变化的json数据。每个请求返回的数据都是固定的格式。我们写了一个model来保存这些数据:

import com.google.gson.JsonElement;

/**
* 网路服务请求
*
* @author tonyzhao
*/
public class HttpRequestResponse {
public String sessionId;
public boolean result;
public String code;
public String error;
public JsonElement data;
}

解析json代码:

  HttpRequestResponse httpRequestResponse = new BaseRequest().parseHttpRequestResponse(httpResponse);

parseHttpRequestResponse方法:

    /**
* 解析httpResponse
*
* @param httpResponse
* @return
*/
public HttpRequestResponse parseHttpRequestResponse(String httpResponse) {
HttpRequestResponse response=null;
index=httpResponse.indexOf("{");
//如果第一个字符是大括号则进行解析
if(index==0){
response = gsonParse(httpResponse, HttpRequestResponse.class);
}else if(index!=-1){//如果是错误的json数据则进行截取解析并上传到友盟
MobclickAgent.reportError(MyApplication.getContext(), httpResponse);
httpResponse=httpResponse.substring(index, httpResponse.length());
response = gsonParse(httpResponse, HttpRequestResponse.class);
}
if (null == response) {
response = new HttpRequestResponse();
response.result = false;
}
return response;
}

由于报错是报的json数据第一行第一列错误,其实也有可能是其他行其他列,我们则找到第一个大括号的位置,找到后将截取正确的json数据再进行解析。如果不是第一个就是大括号则证明是错误的json数据,将错误的json数据上传到友盟上(友盟自定义错误)。如果response为null(报JsonSyntaxException)则将response设置为flase,便于接口回调时根据解析的结果做不同的处理。

gsonParse方法:

 public <T> T gsonParse(String jsonString, Type type) {
try {
return new Gson().fromJson(jsonString, type);
} catch (JsonSyntaxException e) {
MobclickAgent.reportError(MyApplication.getContext(), e.toString()+"---"+jsonString);
return null;
}
}

用Gson解析json数据如果报JsonSyntaxException 则将错误的信息和错误的json上传到友盟(友盟自定义错误统计)

Android处理错误json数据的更多相关文章

  1. Android(java)学习笔记208:Android中操作JSON数据(Json和Jsonarray)

    1.Json 和 Xml       JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的 ...

  2. Android开发——获得Json数据,并显示图片

    流程介绍 使用okhttp网络框架进行get请求,获得json数据 //一个封装好的工具类的静态方法 public static void sendOkHttpRequest(final String ...

  3. Android(java)学习笔记151:Android中操作JSON数据(Json和Jsonarray)

    1.Json 和 Xml       JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的 ...

  4. Android解析服务器Json数据实例

    Json数据信息如下: { "movies": [ { "movie": "Avengers", "year": 201 ...

  5. android发送/接收json数据

    客户端向服务器端发送数据,这里用到了两种,一种是在url中带参数,一种是json数据发送方式: url带参数的写法: url+/?r=m/calendar/contact_list&uid=3 ...

  6. 【Android】解析Json数据

    Json数据:"{\"UserID\":\"Allen\",\"Dep\":IT,\"QQ\":\" ...

  7. android开发学习 ------- json数据与实体类之间的相互转换

    在网络请求的时候,会返回给我们实体类,我们需要将实体类转化为json字符串,方便处理数据: 有时候也会将json数据转换为实体类. 在Android Studio中,json要互相转换,需要用到gso ...

  8. Android笔记(五十) Android中的JSON数据

    JSON是什么: JSON是轻量级的文本数据交换格式 JSON独立于语言和平台 JSON具有自我描述性,更容易理解 JSON语法: 数据在名称/值对中 数据由逗号分割 大括号表示对象 中括号表示数组 ...

  9. android 复杂的json数据解析

    1.通过谷歌的Gson来进行解析: json数据:sTotalString = {"message":"success","result": ...

随机推荐

  1. 关于ShapeDrawable应用的一些介绍(中)之Gradient

    版权声明:本文为博主原创文章,未经博主允许不得转载. Gradient,渐变,是在界面设计中最经常用到的一种技巧,只要涉及到颜色的处理,浓妆淡抹总相宜,说的就是它. 在Android中,当然也提供了这 ...

  2. linux下的oom调试笔记【原创】

    平台信息:内核:linux3.0.68 系统:android/android5.1平台:s5p4418 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 摘要:调整and ...

  3. SUSE glibc升级为2.18过程记录

    先验知识:1.运行时,动态库的装载依赖于ld-linux.so.6的实现,它查找共享库的顺序如下:(1)ld-linux.so.6在可执行的目标文件中被指定,可用readelf命令查看(2)ld-li ...

  4. 【Codeforces 105D】 Bag of mice

    [题目链接] http://codeforces.com/contest/148/problem/D [算法] 概率DP f[w][b]表示还剩w只白老鼠,b只黑老鼠,公主胜利的概率,那么 : 1. ...

  5. merge into语句的使用

    merge语法是根据源表对目标表进行匹配查询,匹配成功时更新,不成功时插入. 其基本语法规则是 merge into 目标表 a using 源表 b on(a.条件字段1=b.条件字段1 and a ...

  6. vue-router 原理解析

    “更新视图但不重新请求页面”是前端路由原理的核心之一,

  7. 前端-JQ思维导图

    看不清的朋友右键保存或者新窗口打开哦!喜欢我可以关注我,还有更多前端思维导图笔记

  8. [原创]一道基本ACM试题的启示——多个测试用例的输入问题。

    Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离. Input 输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数 ...

  9. [ Tools ] [ MobaXterm ] [ SSH ] [ Linux ] 中文顯示解決

    預設是無法顯示中文的,需要修改連線的 Terminal Setting

  10. LINUX 环境安装 jdk-tomcat安装

    linux版本两种安装方式 卸载自带jdk $rpm -qa | grep java $ rpm -e --nodeps java-**-openjdk-*$ rpm -e --nodeps java ...