gpt4 book ai didi

java - 将 Json 映射到嵌套 POJO

转载 作者:行者123 更新时间:2023-12-01 17:50:57 25 4
gpt4 key购买 nike

我有来自一些上游 api 的以下 JSON

{
"Id": "",
"Name": "",
"Age": ""
}

我需要将上面的 json 映射到下游请求 paylaod (POJO) 。

public class Employee
{
@JsonProperty("Id")
private Integer Id;
private User user;
}

public class User {

@JsonProperty("Name")
private String name;

@JsonProperty("Age")
private String age;

}

现在我正在做类似的事情

Employee employee = new ObjectMapper().treeToValue(JsonNode node,Employee.class);

但这会在用户对象中给出 null。

这里的挑战是,我们从上游获取的 json 无法更改。那么,有没有什么方法可以将字段映射到嵌套的 User 对象中,而不改变从上游接收的 json 的结构。

一种解决方案是:将字段分别映射到 User 对象中,然后将其设置到 Employee 对象中。但这不是一个有效的解决方案,因为对于空验证,我们需要分别对 User 和 Employee 对象进行验证。如果嵌套很复杂,那么验证将是重复代码的 hell 。

最佳答案

您的 JSON 不符合您的 Employee类。

因为nameageid 处于同一水平,但你想包装在一个类中 User .

所以要么:

  1. 将json结构更改为

     {
    "id": "",
    "user": {
    "name": "",
    "age": ""
    }
    }

或者

  • 解开 User 类,Employee 类将是:

     public class Employee
    {
    @JsonProperty("Id")
    private Integer Id;

    @JsonProperty("Name")
    private String name;

    @JsonProperty("Age")
    private String age;
    }
  • 编辑

    如果您无法选择选项 1 或 2,那么您只剩下一个选项,那就是创建自定义反序列化器:

    编写反序列化器:

    public class EmployeeDeserializer extends StdDeserializer<Item> { 

    public EmployeeDeserializer() {
    this(null);
    }

    public EmployeeDeserializer(Class<?> vc) {
    super(vc);
    }

    @Override
    public Employee deserialize(JsonParser jp, DeserializationContext ctxt)
    throws IOException, JsonProcessingException {
    JsonNode node = jp.getCodec().readTree(jp);
    int id = (Integer) ((IntNode) node.get("Id")).numberValue();
    String name = node.get("Name").asText();
    String age = node.get("Age")).asText();
    User user = new User(name, age);
    return new Employee(id, user);
    }
    }

    然后注册这个反序列化器:

    ObjectMapper mapper = new ObjectMapper();
    SimpleModule module = new SimpleModule();
    module.addDeserializer(Employee.class, new EmployeeDeserializer());
    mapper.registerModule(module);

    Employee readValue = mapper.readValue(json, Employee.class);

    注册解串器的另一种方法是:

    @JsonDeserialize(using = EmployeeDeserializer.class)
    public class Employee {

    关于java - 将 Json 映射到嵌套 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50228274/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com