当前位置: 首页 > 面试题库 >

带有根元素的Jackson JSON反序列化

白博易
2023-03-14
问题内容

我和Jackson有一个问题,我认为应该很容易解决,但是这真使我丧命。

假设我有一个看起来像这样的Java POJO类(假设对我来说是Getters和Setters):

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

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

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

杰克逊给了我一些问题,因为用户不是JSON中的第一级对象。我显然可以制作一个具有单个User对象的UserWrapper类,然后使用该对象反序列化,但是我知道必须有一个更优雅的解决方案。

我应该怎么做?


问题答案:

编辑:此解决方案仅适用于杰克逊 <2.0

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

  • 您需要使用注释模型类@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]


 类似资料:
  • 我和杰克逊有一个问题,我认为这个问题应该很容易解决,但它正在折磨我。 假设我有一个java POJO类,看起来像这样(假设我有getter和setter): 我想反序列化看起来像这样的JSON到一个User对象: Jackson给了我一些问题,因为User不是JSON中的第一级对象。我显然可以创建一个UserWrapper类,它有一个用户对象,然后使用它反序列化,但我知道一定有一个更优雅的解决方案

  • 问题内容: 我应该如何反序列化以下JSON以跳过根元素并仅解析此JSON的内部。我想避免创建其他仅包含字段的3rd类。 因此,我只希望有以下两个类: 问题答案: 您可以为此使用库。 下面的代码将解决您的问题。

  • 问题内容: 这是我的课程: 这是序列化的JSON: 这是反序列化器代码: 这是例外: 还有一个关于序列化JSON的问题:是否有一种方法可以使JSON序列化程序发布“ @type”而不是“ type”。当前,它看起来像具有属性“类型”的对象。如果我们可以用“ @”修饰它,那么显然这更多的是类型信息而不是属性。 谢谢,Behzad 问题答案: 以下是我对您的两个问题的回答: 问题#1-例外 当使用该属

  • 我正在编写一个RESTeasy代理客户端,以使用Apple的API来检索其iTunes类别列表。当您查询有关给定类别的信息时,例如使用此 URL: …您得到的JSON响应如下: 我试图使用JAXB和Jackson将这个JSON响应映射到一个Java对象。然而,“1420”根元素名称似乎引起了一个问题,因为我在调用我的客户端时得到了以下异常: 我的JAXB类如下所示: 我甚至尝试过创建一个包装类,因

  • 我正在使用JAXB来解封xml文件。这是我的元素特性代码,但是我想在元素特性中有一个特殊的元素顺序,像这样 我检查了一些@XmlType教程(propOrder = {}),但我找不到一种方法来订购元素列表,如这里的属性元素。 这是我的代码。 它总是抛出异常,因为我在propOrder中只定义了一个属性。但是由于属性是多重的,可能是一个或多个,我不知道如何实现它。或者你知道其他排序元素的方法吗 提

  • 问题内容: 我有一个包含许多元素的XML文档,每个元素都有一个或属性。看到这个例子: 我需要一种方法告诉Simple将元素反序列化为a 和将元素反序列化为a 。 我怎样才能做到这一点? 如果您想使用它,这是我目前拥有的代码: 问题答案: 现在真正的问题… 我的回答: 没有!或至少,没关系! 像这里这样的属性只是字符串,不能做出任何决定。但是还有另一种好方法: 实施要为其做出决定的转换器 使用a 做