【问题标题】:Jackson JSON Deserialization with Root Element带有根元素的 Jackson JSON 反序列化
【发布时间】:2012-07-27 02:28:28
【问题描述】:

我有一个关于 Jackson 的问题,我认为应该很容易解决,但这让我很生气。

假设我有一个看起来像这样的 java POJO 类(假设我的 Getter 和 Setter):

class User {
    private String name;
    private Integer age;
}

我想将看起来像这样的 JSON 反序列化为 User 对象:

{
  "user":
    {
      "name":"Sam Smith",
      "age":1
  }
}

Jackson 给了我一些问题,因为 User 不是 JSON 中的第一级对象。我显然可以创建一个具有单个 User 对象的 UserWrapper 类,然后使用它进行反序列化,但我知道必须有一个更优雅的解决方案。

我应该怎么做?

【问题讨论】:

    标签: java json jackson pojo


    【解决方案1】:

    编辑:此解决方案仅适用于 jackson

    对于您的情况,有一个简单的解决方案:

    • 你需要用@JsonRootName(value = "user")注解你的模型类;
    • 您需要使用om.configure(Feature.UNWRAP_ROOT_VALUE, true);(对于 1.9)和 om.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);(对于版本 2)配置您的映射器。

    就是这样!


    @JsonRootName(value = "user")
    public static class User {
        private String name;
        private Integer age;
    
        public String getName() {
            return name;
        }
    
        public void setName(final String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(final Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "User [name=" + name + ", age=" + age + "]";
        }
    
    }
    
    ObjectMapper om = new ObjectMapper();
    om.configure(Feature.UNWRAP_ROOT_VALUE, true);
    System.out.println(om.readValue("{  \"user\":    {      \"name\":\"Sam Smith\",      \"age\":1  }}", User.class));
    

    这将打印:

    User [name=Sam Smith, age=1]
    

    【讨论】:

    • 对于将来访问此页面的任何人,我想指出这仅适用于 Jackson
    • 我认为现在是 DeserializationFeature.UNWRAP_ROOT_VALUE
    • 但是如果 API 暴露了 User 和 List 你应该怎么做?
    • 对于jackson 2.2,该功能也是SerializationFeature.WRAP_ROOT_VALUE
    • 所以我知道这个线程很旧,但是当你的 JSON 看起来像这样时,是否有解决方案? { "user": [ { "name":"Sam Smith", "age":1 }] } 假设您可以确定“user”始终是一个包含一个条目的数组
    猜你喜欢
    • 2013-10-25
    • 2012-02-08
    • 2016-03-22
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    相关资源
    最近更新 更多