【问题标题】:gson handle: Expected BEGIN_OBJECT but was BEGIN_ARRAYgson 句柄:应为 BEGIN_OBJECT 但为 BEGIN_ARRAY
【发布时间】:2016-06-20 23:41:50
【问题描述】:

我正在使用 Retrofit 和 Gson 进行 API 调用。我对来自服务器的响应有疑问。对于某些属性,它发送空的JSONArray 而不是空的JSONObject。例如:

正常情况下:

  {
    "pagination": { 
      "links": {
        "next": "http://api.com/nextlink"
      } 
    }
  } 

但有时当“链接”为空时,服务器会发送给我:

  {
    "pagination": { 
      "links": []
    }
  } 

导致java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY

我知道我可以在创建GsonBuilder 时使用自定义JsonDeserializer 对象“分页”和registerTypeAdapter 来处理它。

但我的问题是:对于所有回复,一般情况下都可以处理这种情况吗?我无权访问 API,因此无法更改它,我不知道哪些属性可以为空 JSONArray 而不是预期的 JSONObject

谢谢。

【问题讨论】:

标签: android gson deserialization retrofit


【解决方案1】:

试试这个来检查它是否是一个对象

yourJson.get("links").isJsonObject()

检查这些方法

isJsonArray()
isJsonObject()
isJsonNull()

【讨论】:

  • 嗨拉维,感谢您的回复。但这不是我的问题的答案。我写道,我可以处理这种情况(即对象分页)。但我正在寻找一种解决方案,该解决方案通常适用于所有响应。问题是,我不知道所有情况,属性可以有空 JSONArray [] 而不是 JSONObject。
【解决方案2】:

通过instanceof函数检查后可以使用JSONTokener获取正常的Object,尝试如下:

String jsonData =  "{...}"; //your json data string
JSONTokener tokener = new JSONTokener(jsonData);
    try {
        Object parsedObj = tokener.nextValue();
        if (parsedObj instanceof JSONObject) {

               //do something here
        }else if (parsedObj instanceof JSONArray){
             //do something here
        }
     }catch(Exception ex){}

在此处阅读更多信息enter link description here

【讨论】:

    猜你喜欢
    • 2013-05-15
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    相关资源
    最近更新 更多