【问题标题】:API responds with different JSON types each timeAPI 每次响应不同的 JSON 类型
【发布时间】:2017-11-21 11:00:19
【问题描述】:

我正在从 JSON API 获取数据。我正在使用 GSON 来解析我的 Android 应用程序的数据。问题是,同一变量的值在一种情况下是 JSONArray,但在另一种情况下,它是 JSONObject。因此,我无法编写 GSON 可以用来解析数据的 Java 类。

第一反应 - “方向”是一个数组

{  
     "route":{  
     "time_min":"10",
     "directions":{  
     "direction":[ 

        {  
           "direction_description":"Dummy text.",
           "direction_number":"1"
        },

        {  
           "direction_description":"Dummy text.",
           "direction_number":"2"
        },

        {  
           "direction_description":"Dummy text.",
           "direction_number":"3"
        }

      ]}}}

第二反应 - “方向”是一个对象

{  
     "route":{  
     "time_min":"10",
     "directions":{  
     "direction": 
        {  
           "direction_description":"Dummy text.",
           "direction_number":"1"
        }

       }}}

我应该如何编写 GSON 将用于解析的 Java 类?

【问题讨论】:

  • 你说的区别是什么?
  • 你发布的两个回复完全一样。
  • 没看出有什么区别???
  • 返回数组时,我需要创建一个对象的列表。返回对象时,我只需要创建一个具有相同变量名的对象。我不能在同一个类中两次使用相同的变量名。 “@SerializedName”注释也不起作用。
  • 我认为你误解了你的 json。您有 1) JSONObject,名称为 directions(带有 s)。 2) 一个名为 direction 的 JSONArray(不带 s)。

标签: java android json deserialization json-deserialization


【解决方案1】:

首先,尝试选择 JSONObject

JSONObject jOBJ = parentOBJ.optJSONObject("direction");

如果 jOBJ 的值为null 尝试获取JSONArray -

JSONOArray jARR = parentOBJ.optJSONArray("direction");

PS, 需要时使用try.. catch()

【讨论】:

  • 我无法执行此操作,因为我使用 GSON 进行解析而不是手动执行。如果我手动进行解析,我能否使其工作?
  • 当然,首先获取objectarray,然后使用gson序列化json。或者您可以手动完成整个操作,而无需使用 gson
【解决方案2】:

您可以使用instance of

java instanceof 运算符用于测试对象是否为 指定类型(类或子类或接口)的实例。

Object obj= jsonOBJ.get("direction");
if (obj instanceof JSONArray) 
  {


  }
else
  {
   // It's JSONObject 
  }

【讨论】:

  • 我无法执行此操作,因为我使用 GSON 进行解析而不是手动执行。如果我手动进行解析,我能否使其工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多