Десериализация Gson - вложенные классы, отображающие строчные поля

1

В настоящее время я использую библиотеки Gson для десериализации json файла в некоторые экземпляры класса Java. Кажется, что все работает нормально, но я сталкиваюсь с проблемами с вложенными классами с определениями нижнего регистра. My FieldNamingPolicy имеет значение FieldNamingPolicy.UPPER_CAMEL_CASE, которое работает для всего в иерархии, за исключением элементов в моем вложенном классе с именами полей в нижнем регистре (в отличие от PascalCase).

Есть ли что-то особенное в том, что смешанные случаи, используемые в анализируемом JSON?

Я не уверен, что мое объяснение имеет смысл, поэтому вот надуманный пример того, как выглядит мой json, и проблема, с которой я сталкиваюсь:

{
    "Name": "David",
    "City": "Los Angeles",
    "Website": "http://www.example.org/1",
    "Contact": {
      "AllowPhone": "true",
      "Priority": "10",
      "Address": {
        "street": "1234 Example St",
        "city": "Los Angeles",
        "state": "CA",
        "phone": "(777)777-7777"
      }
    }
}

У меня есть классы, основанные на этой иерархии:

  1. PersonModel (с полями для имени, города, штата, веб-сайта и контакта)
  2. ContactModel (с полями для AllowPhone, Priority, Address)
  3. AddressModel (с полями для улицы, города, штата, телефона)

Примеры классов:

public class PersonModel{

  @Expose
  String name;

  @Expose
  String city;

  @Expose
  String website;

  @Expose
  ContactModel contact;

  /* getters for all the above defined */
}

public class ContactModel{

  @Expose
  String allowPhone;

  @Expose
  int priority;

  @Expose
  AddressModel address;

  /* getters for all the above defined */

}

public class AddressModel{ /* fields are lower case! */

  @Expose
  String street;

  @Expose
  String city;

  @Expose
  String state;

  @Expose
  String phone; 

  /* getters for all the above defined */

}

Когда я пытаюсь десериализовать json в свою структуру класса Person и Contact, как и следовало ожидать. Я даже получаю экземпляр AddressModel. Однако поля в экземпляре AddressModel равны нулю.

Может ли кто-нибудь указать мне на исправление проблемы или, если есть что-то еще, неправильный подход?

Теги:
deserialization
gson

1 ответ

1
Лучший ответ

Как указано в javadoc, GsonBuilder#setFieldNamingPolicy(FieldNamingPolicy)

Настраивает Gson для применения определенной политики именования к полю объекта во время сериализации и десериализации.

Таким образом, поля отображаются как

Java name | Json name
   name   |  Name

также должны работать для десериализации. Они работают для PersonModel и ContactModel потому что политика верна.

Однако для класса AddressModel это выглядит так:

Java name | Json name
  street  |  street

Таким образом, политика не поддерживается, и Gson не находит эти поля для десериализации.

Я предлагаю использовать @SerializedName чтобы точно указать, каким будет имя в JSON.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню