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

将Json字段包装到pojo的实例变量中

祝俊
2023-03-14
问题内容

我试图将某些json字段映射到类实例变量。

我的示例 Person 类如下所示:

public class Person {
   private String name;
   private Address address;

   //many more fields

   //getters and setters
}

示例 地址 类为:

public class Address {
   private String street;
   private String city;
   //many more fields

   // getters and setters
}

要反序列化到我的Person类的json对象不包含“地址”字段。看起来像:

{
"name":"Alexander",
"street":"abc 12",
"city":"London"
}

有没有办法将json反序列化为Person pojo,其中Address字段也正确映射?

我已经使用了自定义地址反序列化器,如此处许多文章所述。但是,由于Json对象不包含“地址”字段,因此没有被调用。

我已经通过使用JsonNode手动映射每个字段解决了这个问题,但是在我的真实项目中,这不是一个很好的解决方案。

使用Jackson可以解决此问题吗?另外,如果在此之前有人问过这个问题,那么我会为此道歉,因为我一直在寻找解决方案,但可能还没有看到。。


问题答案:

@JsonUnwrapped为此问题引入了注释。模型:

class Person {
    private String name;

    @JsonUnwrapped
    private Address address;

    // getters, setters, toString
}
class Address {
    private String street;
    private String city;

    // getters, setters, toString
}

用法:

ObjectMapper mapper = new ObjectMapper();
String json = "{\"name\":\"Alexander\",\"street\":\"abc 12\",\"city\":\"London\"}";
System.out.println(mapper.readValue(json, Person.class));

印刷品:

Person{name='Alexander', address=Address{street='abc 12', city='London'}}

有关更多信息,请阅读:

  1. 杰克逊注释示例
  2. 注释类型JsonUnwrapped
  3. Jackson JSON-使用@JsonUnwrapped将属性序列化/反序列化为扁平化的数据结构


 类似资料:
  • 问题内容: 这是JDK的类方法。作者为什么将字段分配给局部变量? 上面和下面之间有什么区别?这与线程安全有关吗? 问题答案: 为了稍微扩展一下Michael的答案,我希望它可以确保该方法永不返回,而且还可以提供所提到的性能优势。 给出以下代码: 至少从理论上讲,在多线程代码中,可以将字段设置为第一次读取()和第二次读取之间,然后将其返回。我没有看过其余的代码,但是我假设还有其他可能被分配的地方。对

  • 假设我有一个具有公共字段 和 的类 。假设我有另一个 pojo 类 ,但它使用 setter 和 getter,所以它有 setX() 和 setY()。 我想使用一些自动方法从实例复制到并返回。 至少使用默认设置,推土机的 未正确复制字段。 那么,是否有一个简单的配置更改可以让我使用Dozer或其他库来完成上述操作?

  • Java类(用作数据传输对象): 类资源还有一个名为的字段,它的getter和setter具有不同的类型,因此出现语法错误。 由于上面的类是一个DTO,一个JSON响应(带有字段)将映射到它,并且不能使用getId(),我想将字段更改为,并相应地更改getter和setter,并用一个注释标记它,说明bind this to字段。 注意:我用的是Spring靴。我尝试使用@JSONProperty

  • 我正在编写一个JSON接口/库,用于Bugzilla的webservice。 这可以使用注释或其他内容吗?还是要为每个这样的实例编写一个自定义反序列化程序? 我试着做了一些研究,发现了一些关于值实例化器或使用构造函数的信息,但使用构造函数不是反bean吗?我发现新特性的文档很少或难以理解。 示例: 我对一个字段使用pojo的原因是,这个用户类是由另一个具有更多字段的用户类扩展的。虽然我可以实现一个

  • 目前,我的应用程序需要一些应该附加到日志消息中的值。由于它在SL4J下使用Log4J2,我的第一个想法是对Log4J记录器进行包装,在那里我可以向输出中添加新值。 一些博客指出我应该写一个日志,一个LoggerFactory和一个活页夹。但它们已经相当过时(2011年),并且不希望这些代码与当前的lib一起工作。 我还看到了一些关于线程上下文的东西,看起来像我想要构建这个测试。 所以我的问题是什么