【问题标题】:Mapping nested JSON to a Java POJO将嵌套 JSON 映射到 Java POJO
【发布时间】:2020-03-19 00:28:59
【问题描述】:

我在使用 Jackson 将嵌套的 JSON 响应映射到 POJO 时遇到困难。目前,Users 类中的值返回为 null。

JSON:

{
"users": [
    {
        "username": "johnSmith123",
        "email": "johnSmith123@gmail.com",
        "birthday": "1989-10-23"
    }
]
}

POJO:

public class Users {

  @JsonProperty("username")
  public String username;
  @JsonProperty("email")
  public String email;
  @JsonProperty("birthday")
  public String birthday;

}

控制器方法:

private ObjectMapper mapper = new ObjectMapper();

ResponseEntity<String> response = restTemplate.exchange(
        accountUrl, HttpMethod.GET, entity, String.class);

Users user = mapper.readValue(response.getBody(), Users.class);

我该如何解决这个问题?

谢谢

【问题讨论】:

  • 看起来您的 POJO 已正确设置所有内容。但是您尝试使用的 JSON 是对象的集合。所以你会想使用:List&lt;Users&gt; user = mapper.readValue(response.getBody(), new TypeReference&lt;List&lt;Users&gt;&gt;(){});
  • 嗨,我刚试过,但不幸的是得到了以下错误:com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of java.util.ArrayList&lt;com.package&gt; out of START_OBJECT token..
  • 啊,我看到您正在使用 Jackson 进行 JSON 绑定。我建议更新到更新的 Jakarta EE 投诉 JSON 绑定库,例如 Yasson。使用此库,您可以使用以下语法使用列表:github.com/eclipse-ee4j/jsonb-api/blob/master/docs/src/docs/…
  • 感谢您的跟进,但我最终创建了一个包装类作为实现

标签: java json spring-boot jackson


【解决方案1】:

Users JSON Object 包裹在 JSON Array 中,而 JSON Array 包裹在根 JSON Object 中。您需要使用集合类型:

TypeReference<Map<String, List<Users>>> usersType = new TypeReference<Map<String, List<Users>>>() {};
Map<String, List<Users>> wrappedUsers = mapper.readValue(body, usersType);
List<Users> users = wrappedUsers.values().stream().flatMap(Collection::stream).collect(Collectors.toList());

或者创建包装类:

class UsersHolder {
    public List<Users> users;

    //getters, setters
}

你可以用作:

UsersHolder wrappedUsers = mapper.readValue(body, UsersHolder.class);
System.out.println(wrappedUsers.users);

另见:

【讨论】:

  • 我添加了包装类,它运行良好。还有一个问题,如果您不介意...使用 User 类是否仍然有意义,以便我可以像这样访问它:wrappedUsers.users.get(0).getUsername() 还是会被视为不必要的?谢谢
  • @user2047296,实际上它只取决于你和你喜欢什么。我可能会得到用户:Users user = wrappedUsers.getUsers().get(0); Wrapper 类仅用于反序列化,因此不应传递给应用程序的其他层。
  • 确实有道理,感谢您的解释:)
  • 我的问题听起来与此非常相似。我不确定我到底需要为我的情况改变什么。你能帮我解决这个问题Nested JSON response from SQL View 吗?我没时间了:(@MichałZiober
猜你喜欢
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2014-04-08
相关资源
最近更新 更多