【问题标题】:Deserializing JSON objects wrapped inside unnamed root object using Jackson使用 Jackson 反序列化包裹在未命名根对象中的 JSON 对象
【发布时间】:2021-04-25 17:28:10
【问题描述】:

我必须使用一个 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 响应编写单独的包装类?

【问题讨论】:

    标签: java json jackson json-deserialization jackson-databind


    【解决方案1】:

    你可以这样做:

    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)
    

    【讨论】:

    • 哇,这很好用。很好很简单。我害怕编写自定义反序列化器。
    猜你喜欢
    • 2014-02-12
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 2020-07-21
    • 2020-08-07
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多