Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

在使用Rxjava+Retrofit进行网络请求获取数据后,通过Gson解析会报这个错:

Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

原因是返回的数据是一个数组,导致解析报错,但是当我把泛型设置为List还是没有办法解析正确是因为,返回的数组的Bean里的参数其实并不是一致的,比如我们通过GsonFormat生成的这个Bean的格式是:

Student:{
  username:"zhangsan",
  city:"shanghai"
  age:18
}

但是服务器返回的数据里可能是有这样的Bean格式:

Student:{
  username:"zhangsan",
  city:["shanghai","Beijing","GuangZhou"]
  age:18
}

观察这两个Bean的格式,虽然参数都有username、city和age,但是因为city的数据类型不一致,导致的解析报错,而这很容易被忽略。
http://blog.sina.com.cn/s/blog_cf6e4e230101rnot.html
https://cloud.tencent.com/developer/article/1014485
https://cloud.tencent.com/developer/article/1014485
https://blog.csdn.net/shareye1992/article/details/51273590/
https://blog.csdn.net/dr_abandon/article/details/83619557

上面好几种方案都点明了让后台修改返回的数组格式,但是因为我们知道后台要去修改的话,很花费很大的精力,而且如果我现在就要使用,哪能等到后台去解决了这个问题,我才接着开发,后来我就想着能不能把泛型设置成一个通用的,这样至少返回的数据解析不会报错,至于接下来的,我们再对其进行数据类型转换就可以了。

首先我们知道,之所以会有这个问题,是因为返回的是数组格式的数据,所以我写成这样的:

    //获取数据点
    @GET("/v1/dev/xxxxxxx")
    Observable getData();

但是,却还是提示数据格式报错:

Expected a com.google.gson.JsonObject but was com.google.gson.JsonArray

意思是,你期望的是JsonObject类型的数据,但是服务器返回的却是JsonArray类型的,所以,我们只要将JsonObject更改为JsonArray就可以了。那么,JsonObject 和 JsonArray到底有什么区别呢?
切记:JsonArray和JSONArray 不一样!!

JsonArray:com.google.gson.JsonArray
JSONArray:org.json
                   Type listType = new TypeToken>() {}.getType();
                        LinkedList result = new Gson().fromJson(String.valueOf(deviceSchemaNetBeans), listType);
                        Log.d("seeeeeee----onNext", new Gson().toJson(result));

你可能感兴趣的:(Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $)