Обработка ответа JSON с несколькими типами с одинаковым именем

Ответ 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 со значениями true и false.

Мой вопрос в том, как определить класс POJO для этой ситуации.

Я попытался создать два поля с одинаковым именем с помощью @Nullable для обоих, но Gson жалуется, что POJO имеет повторяющиеся поля.

почему два свойства представляют одну и ту же информацию. Также зачем вам создавать POJO с двумя полями с одинаковым именем, если таких полей нет в json

Tim 04.12.2018 12:10

Я не знаю, тип должен быть одинаковым во всех случаях, но я не могу изменить API.

Ali Habbash 04.12.2018 12:13

мой второй вопрос важнее

Tim 04.12.2018 12:16

Вы можете объявить в своем pojo переменную "success" универсального типа "object", а затем использовать экземпляр, чтобы понять, является ли она логическим или целочисленным.

Nicola Gallazzi 04.12.2018 12:17

^ не делай этого

Tim 04.12.2018 12:20

@TimCastelijns, почему бы и нет?

Nicola Gallazzi 04.12.2018 12:22

@NicolaGallazzi Я не работаю и возвращаю исключение, которое Gson исключил OBJECT и получил НОМЕР

Ali Habbash 04.12.2018 12:24

@TimCastelijns Я отредактировал свой вопрос, мне нужно определить 2 поля для обработки, когда isConflict == 1 и isConflict == 0, потому что каждый случай возвращает другой тип, но с тем же именем

Ali Habbash 04.12.2018 12:27

используйте список конфликтов, если данных нет, он предоставит список массивов null .. SerializedName ("isConflict") Expose private long isConflict; SerializedName ("конфликт") Раскрыть закрытый список <Conflict> конфликт = null;

kuber singh 04.12.2018 12:44

Большое вам спасибо, это сработало

Ali Habbash 04.12.2018 13:00
0
10
635
1

Ответы 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")
        }

Другие вопросы по теме