此前一直都没遇到也一直相信服务端返回的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. 安装visual studio 2013--【转】

    本文转载自:http://blog.csdn.net/tina_ttl/article/details/51544733#1下载-visual-studio-ultimate-2013安装包 1.下载 ...

  2. LDA解决的问题

    人类是怎么生成文档的呢?LDA的这三位作者在原始论文中给了一个简单的例子.比如假设事先给定了这几个主题:Arts.Budgets.Children.Education,然后通过学习训练,获取每个主题T ...

  3. [xPlugin] smartupload jsp图片上传

    URL:http://www.cnblogs.com/ISeeYouBlogs/p/jsp.html 1.要实现图片上传,首先需要一个组件,这里我用的是smartupload.jar可以到这里下载ht ...

  4. Vue常用插件总结

    Vue-router ----- 路由插件 Vue-loader-----webpack的加载器,允许您以称为单文件组件(SFC)的格式创作Vue组件   Vue-resource-----提供了使用 ...

  5. 24. Swap Nodes in Pairs[M]两两交换链表中的节点

    题目 Given a linked list, swap every two adjacent nodes and return its head. You may not modify the va ...

  6. B - Soldier and Bananas

    Problem description A soldier wants to buy w bananas in the shop. He has to pay k dollars for the fi ...

  7. vue项目中阻止浏览器返回上一页

    vue项目中在某个页面阻止浏览器返回上一页,适用移动端.PC端. 使用场景例如: 首页 与 A页面     来回跳转,那样点击浏览器返回时也会来回跳转,本想当页面在首页的时候就不再返回了,所以这个时候 ...

  8. 6) 十分钟学会android--Activity的生命周期之启动与销毁

    当用户导航.退出和返回您的应用时,应用中的 Activity 实例将在其生命周期中转换不同状态. 例如,当您的Activity初次开始时,它将出现在系统前台并接收用户焦点. 在这个过程中,Androi ...

  9. Fiddler-AutoResponder 修改接口数据

    问题 App 功能测试时,有些场景需要特殊的数据,如 App 对极限值的处理:或是账单列表的时间需要显示刚刚.昨天.周几,需要接口返回不同的时间.更改数据库是一种方法,但不够灵活,一些复杂的场景也不好 ...

  10. 小米 SOAR 开源SQL优化工具安装

    github :https://github.com/xiaomi/soar 安装说明 :https://github.com/XiaoMi/soar/blob/master/doc/install. ...