Gson反序列化 - 嵌套类映射小写字段

时间:2014-03-15 19:26:31

标签: java deserialization gson

我目前正在使用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"
      }
    }
}

我有基于这种层次结构的类:

  1. PersonModel(包含姓名,城市,州,网站和联系人的字段)
  2. ContactModel(包含AllowPhone,Priority,Address的字段)
  3. AddressModel(包含街道,城市,州,电话的字段)
  4. 班级的例子:

    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。

    任何人都可以指出我要么解决案件问题,要么是否有其他问题需要调整方法?

1 个答案:

答案 0 :(得分:1)

正如javadoc所述,GsonBuilder#setFieldNamingPolicy(FieldNamingPolicy)

  

配置Gson将特定命名策略应用于对象的字段   序列化期间和反序列化

所以字段映射为

Java name | Json name
   name   |  Name

还必须为反序列化工作。它们适用于您的PersonModelContactModel,因为该政策适用。

但是,对于您的AddressModel课程,它看起来像是

Java name | Json name
  street  |  street

所以政策没有得到维护,Gson没有找到那些字段来反序列化它们。

我建议使用@SerializedName来准确指定JSON中的名称。