杰克逊序列化具有相同名称的嵌套属性

Jackson serialize nested attribute with same name

目前,我有一个 JSON 以下类型的响应。

{
   "user":{
      "user":{
         "name":"Demo",
         "age":25,
         "eail":"demo@abc.com"
      },
      "address":{
         "country":"NZ"
      }
   }
}

我想将我的自定义 class 映射到嵌套的用户属性。

@Data
public class Demo{
      @JsonProperty("user")
      private User user;
      private Address address;
}

但是当我试图获取属性时,它总是发送 null 值。我认为它映射到第 2 行 "user" 的第一次出现。

如何将其映射到第 3 行中的更正 user 属性。

映射从 JSON 的根开始,因此此 JSON 的正确 class 定义将是此

public class Demo {
    @JsonProperty("user")
    private DemoUser user;
}
public class DemoUser {
    @JsonProperty("user")
    private User user;

    @JsonProperty("address")
    private Address address;
}

如果你想保持 class 不变,只想使用内部的 'user',你可以像这样使用 JsonNode

ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readValue(jsonString, JsonNode.class);
Demo demo = mapper.readValue(node.at("/user").toString(), Demo.class);

at() 方法接受 JSON 路径表达式,它是 JSON 中特定节点的路径。

这里,"/user"表示它将从JSON的根节点找到节点user,并将return它。

同样,

node.at("/user/user").toString();

会给你

{
  "name":"Demo",
  "age":25,
  "eail":"demo@abc.com"
}