Как обрабатывать необязательные поля JSON в Retrofit для Android?

Я работаю над парсером JSON для приложения Android. Когда я обращаюсь к серверу за данными, появляются некоторые необязательные поля, как мне это обработать в Retrofit с помощью GSON конвертера?

Нормальный ответ

{
   "status":"SUCCESS",
   "class-1":{
      "class.enddate":"Jan/10/2016",
      "class.startdate":"Jan/10/2015",
      "class.title":"Physics 1",
      "class.short.description":"Physics 1",
      "class.description":"This is a Physics Class"
   }
}

Альтернативный ответ, когда в некоторых полях нет данных

{
  "status":"SUCCESS",
  "class-1":{
     "class.enddate":"Jan/10/2016",
     "class.startdate":"Jan/10/2015",
     "class.title":"Physics 1"
   }
}

POJO Классы

public class MyClass {
    @Expose @SerializedName("status")
    public String status;

    @Expose @SerializedName("class-1")
    public MyClassInformation myClassInformation;
}

public class MyClassInformation {
    @Expose @SerializedName("class.title")
    public String classTitle;

    @Expose @SerializedName("class.short.description")
    public String classShortDescription;

    @Expose @SerializedName("class.description")
    public String classDescription;

    @Expose @SerializedName("class.startdate")
    public String startDate;

    @Expose @SerializedName("class.enddate")
    public String endDate;
}

Как создать классы POJO таким образом, чтобы обрабатывать необязательные поля, отсутствующие? В тот момент, когда весь объект MyClassInformation становится пустым, когда поля пропадают, пожалуйста, помогите.

2 ответа

Решение

Мне удалось решить это методом проб и ошибок, мне удалось заставить его работать, удалив аннотацию @Expose и изменив конструктор Gson... Теперь весь объект не обнуляется или исключается, если поля отсутствуют и отображаются только отсутствующие поля как ноль.

Это то, что я изменил, с

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

к

Gson gson = new GsonBuilder().create();

Надеюсь, это поможет любому, кто ищет подобный ответ.

Я боролся с этим пару лет назад.

Вероятно, нет хорошего ответа на это. По крайней мере, не то, что я знаю.

Рассмотрено 3 варианта:

  1. Установите все элементы как обязательные поля (при условии, что они все известны заранее) и установите для них значение Null если не получено значение, если тип имеет смысл (например, это не всегда имеет смысл для примитивных типов). Здесь вы уделяете больше внимания тем, кто передает вам JSON, но ваш код Java проще, но менее гибок.
  2. Установите дополнительные поля в контейнере пар ключ-значение, где ключом и значением являются строки. Контейнер может быть пустым списком, если не были переданы дополнительные свойства. Здесь у вас больше гибкости, но вам нужно больше работать над созданием пользовательских (де) сериализаторов.
  3. Используйте комбинацию 1 и 2.

У каждого варианта есть свои плюсы и минусы, и я выбрал вариант 3.

Надеюсь, это поможет и удачи!

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