我目前正在使用Gson库将json文件反序列化为某些java类实例。一切似乎都运行良好但我遇到了嵌套类与小写字段定义的问题。我的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实例上的字段都为null。
任何人都可以指出我要么解决案件问题,要么是否有其他问题需要调整方法?
答案 0 :(得分:1)
正如javadoc所述,GsonBuilder#setFieldNamingPolicy(FieldNamingPolicy)
配置Gson将特定命名策略应用于对象的字段 序列化期间和反序列化。
所以字段映射为
Java name | Json name
name | Name
还必须为反序列化工作。它们适用于您的PersonModel
和ContactModel
,因为该政策适用。
但是,对于您的AddressModel
课程,它看起来像是
Java name | Json name
street | street
所以政策没有得到维护,Gson没有找到那些字段来反序列化它们。
我建议使用@SerializedName
来准确指定JSON中的名称。