此前一直都没遇到也一直相信服务端返回的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. MySQL Study之--MySQL体系结构深入解析

    MySQL Study之--MySQL体系结构深入解析 MySQL体系架构 由连接池组件.管理服务和⼯工具组件.sql接口组件.查询分析器组件.优化器组件.缓冲组件.插件式存储引擎.物理⽂文件组成.m ...

  2. UI 经常用法总结之--- UIWindow UIView (不断更新中)

     UIWindow (UIView) 1.创建一个uiwindow对象 self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScr ...

  3. Uva1335 二分+贪心

    /* 奇数怎么搞呢 二分到答案怎么judge呢 贪心怎么贪呢 假设贪心方案是 前两个挨着取 后面的能靠前就靠前 这样子似乎保证了ans最min 但是不管贪的对不对 操作起来时间GG 而且 如果真的这样 ...

  4. luogu3093 牛奶调度

    题目大意 有一些奶牛,它们能挤出不同数量的奶,要想挤它要在其所对应的最后期限前完成.一个时间点只能挤完一个奶牛.问最多能挤出多少奶? 题解 如果我们要挤一个奶牛,我们要让他越晚被挤越好,这样构成最优解 ...

  5. POJ1742 Coins 背包

    题目大意:给出一些钱币的价值和对应的数目,求在一定价值限定下这些钱币能凑成的价值数. 本题用多重背包直接拆分或二进制拆分法都太慢.说起处理一组物品,完全背包可算是比较效率高的,但是本题中物体的数目是有 ...

  6. Spark中常用的算法

    Spark中常用的算法: 3.2.1 分类算法 分类算法属于监督式学习,使用类标签已知的样本建立一个分类函数或分类模型,应用分类模型,能把数据库中的类标签未知的数据进行归类.分类在数据挖掘中是一项重要 ...

  7. Java:笔记-1

    ylbtech-Java:笔记-1 1.返回顶部 1. /** * 简介请求 * @return */ @RequestMapping("/JJ") public String j ...

  8. 网络:万维网(WWW)

    ylbtech-网络:万维网(WWW) www (万维网缩写)同义词 万维网一般指www(万维网缩写)WWW是环球信息网的缩写,(亦作“Web”.“WWW”.“'W3'”,英文全称为“World Wi ...

  9. git如何解决冲突(master分支的上的冲突--太岁头上动土)

    欢迎加入前端交流群交流知识&&获取视频资料:749539640 git是什么就不废话了,详情点击 出现以下情况怎么解决? 有个index.ts文件 export const ENV = ...

  10. [Javascript] 5个最佳的Javascript日期处理类库

    在大家日常网站开发和web应用开发中,我们往往需要有效的调用Javascript处理日期和时间格式相关的函数,在Javascript中已经包含了部分最基本的内建处理方法. 在大家日常网站开发和web应 ...