В настоящее время я использую библиотеки 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"
}
}
}
У меня есть классы, основанные на этой иерархии:
Примеры классов:
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 равны нулю.
Может ли кто-нибудь указать мне на исправление проблемы или, если есть что-то еще, неправильный подход?
Как указано в javadoc, GsonBuilder#setFieldNamingPolicy(FieldNamingPolicy)
Настраивает Gson для применения определенной политики именования к полю объекта во время сериализации и десериализации.
Таким образом, поля отображаются как
Java name | Json name
name | Name
также должны работать для десериализации. Они работают для PersonModel
и ContactModel
потому что политика верна.
Однако для класса AddressModel
это выглядит так:
Java name | Json name
street | street
Таким образом, политика не поддерживается, и Gson не находит эти поля для десериализации.
Я предлагаю использовать @SerializedName
чтобы точно указать, каким будет имя в JSON.