繁体   English   中英

将Json映射到嵌套POJO

[英]Mapping Json into nested POJO

我从一些上游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);

但这在User Object中提供了null。

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

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

您的JSON不符合Employee类。

因为nameageid处于同一级别,但是您希望将其包装在User类中。

所以:

  1. 将json的结构更改为

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

要么

  1. 解开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 {

看来您没有正确嵌套JSON。 否则您的对象结构错误。

JSON应该是:

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

json结构与您的类的结构不匹配。 如果json就像;

{
  "Id": "an-id,
  "user": {
    "Name": "Joe",
    "Age": "21"
  }
}

然后,将要反序列化为Employee对象的代码将起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM