【问题标题】:Handle JSON response with multiple type of the same name处理多个同名类型的 JSON 响应
【发布时间】:2018-12-04 11:07:35
【问题描述】:

JSON 响应是:

{
    "success": false,
    "errorMessages": [
        "You have to select a maximum load of <span style='color:red;'>0</span> Credit/Course but you have selected <span style='color:red;'>3</span> Credit/Course --- [R060]",
        "You can register courses as a full study with a load limit between <span style='color:red;'>12</span> and <span style='color:red;'>18</span> Credit/Course, but you have selected <span style='color:red;'>9</span> Credit/Course --- [R062]"
    ],
    "isConflict": 0
}

但是当isConflict == 1 的响应是:

{
    "ignoreConflictValue": "W",
    "isConflict": 1,
    "conflict": [
        {
            "EXAM_DATE": "01/01/2019",
            "START_TIME": "08:00 AM",
            "END_TIME": "09:30 AM",
            "COURSE_NAME_SL": "مقاومة مواد,تقنيات الحفر البحري",
            "COURSE_NAME_PL": "STRENGTH OF MATERIALS,OFFSHORE TECHNOLOGY",
            "COURSES_COUNT": "2",
            "ACTIVE": "A"
        }
    ],
    "success": false
}

这个API的逻辑是:

  • isConflict == 1 成功属性为 Integer 类型时,值为 1 和 0。
  • 否则成功属性是Boolean 类型,其值为truefalse

我的问题是如何为这种情况定义 POJO 类。

我尝试使用 @Nullable 为两者创建两个同名的字段,但 Gson 抱怨 POJO 有重复的字段。

【问题讨论】:

  • 为什么会有 2 个属性代表相同的信息。另外,如果 json 中没有这样的字段,为什么还要创建一个包含 2 个同名字段的 POJO
  • 我不知道,类型必须在所有情况下都相同,但我无法更改 API。
  • 我的第二个问题更重要
  • 您可以在 pojo 中声明泛型类型“object”的“success”变量,然后使用实例来了解它是布尔值还是整数
  • 使用冲突列表,如果数据不存在,它将提供数组列表 null.. SerializedName("isConflict") 公开私有 long isConflict; SerializedName("conflict") 公开私有列表 conflict = null;

标签: android retrofit2 gson


【解决方案1】:

在 Kotlin 中,您可以执行以下操作:

使用如下泛型定义“ApiResponse”类:

class ApiResponse(@SerializedName("success") val success : Any,
                  @SerializedName("errorMessages") val errorMessages : Array<Any>,
                  @SerializedName("isConflict")
                  val isConflict : Integer)

然后,在您的活动中,使用 Gson 将响应转换为

 var responseOne = Gson().fromJson(textConflictOneResponse, ApiResponse::class.java)
        var responseZero = Gson().fromJson(textConflictZeroResponse, ApiResponse::class.java)

然后您可以通过以下方式检查响应的类型:

if (responseOne.success is Boolean){
            Log.v(TAG,"Boolean")
        } else{
            Log.v(TAG,"not boolean")
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-22
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多