使用Jackson反序列化封装在未命名根对象中的JSON对象



我必须使用一个API来返回包装在未命名根对象中的所有对象。类似这样的东西:

{
"user": {
"firstname":"Tom",
"lastname":"Riddle"
}
}

在这里,我只对反序列化user对象感兴趣。但考虑到响应的性质,如果我想成功地反序列化user对象,我就必须编写一个封装它的类。

@Getter
@Setter
@ToString
// Wrapper class
public class Info {
private User user;
}

然后

@Getter
@Setter
@ToString
public class User {
private String firstname;
private String lastname;
}

API的所有响应都以这种方式返回响应,因此我正在寻找一种方法来反序列化响应,使其具有一个可用于提取任何类型的JSON对象的通用包装器类。

我试过这个:

@Getter
@Setter
public class ResponseWrapper<T> {
private T responseBody;
}

然后

ResponseWrapper<User> userInfo = objectMapper.readValue(response.body().string(), ResponseWrapper.class);

但这导致了以下异常:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "user" (class com.redacted.response.ResponseWrapper), not marked as ignorable (one known property: "responseBody"])

那么,我有没有任何方法可以反序列化这个响应,而不必像这样为每个API响应编写单独的包装器类?

您可以这样做:

JsonNode jsonNode = objectMapper.readTree(response.body().string());
String content = jsonNode.elements().next().toString();
User user = objectMapper.readValue(content, User.class);

输出:

User(firstname=Tom, lastname=Riddle)

最新更新