使用 Jackson 反序列化包裹在未命名根对象中的 JSON 个对象
Deserializing JSON objects wrapped inside unnamed root object using Jackson
我必须使用一个 API,它 return 将所有对象包裹在一个未命名的根对象中。像这样:
{
"user": {
"firstname":"Tom",
"lastname":"Riddle"
}
}
在这里,我只对反序列化 user
对象感兴趣。但是鉴于响应的性质,如果我想成功反序列化它,我将不得不编写一个 class 来包装 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 return 的所有响应都以这种方式响应,所以我正在寻找一种方法来反序列化响应,以便拥有一个通用包装器 class 可用于提取任何类型的 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 响应编写单独的包装器 classes 吗?
你可以这样做:
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)
我必须使用一个 API,它 return 将所有对象包裹在一个未命名的根对象中。像这样:
{
"user": {
"firstname":"Tom",
"lastname":"Riddle"
}
}
在这里,我只对反序列化 user
对象感兴趣。但是鉴于响应的性质,如果我想成功反序列化它,我将不得不编写一个 class 来包装 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 return 的所有响应都以这种方式响应,所以我正在寻找一种方法来反序列化响应,以便拥有一个通用包装器 class 可用于提取任何类型的 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 响应编写单独的包装器 classes 吗?
你可以这样做:
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)