java - Jackson - 将 JSON 反序列化为类

标签 java json spring jackson deserialization

我正在调用一个返回 JSON 的端点,它看起来像这样(在 Postman 中):

{
    "Result": {
        "attribute1": { ... },
        "attribute2": { ... }
    }
}

此请求返回的 Content-Type header 是 text/x-json(与通常的 application/json 相对)。我认为这在尝试通过 Jackson 反序列化时会导致一些问题。这个 JSON 的 POJO 看起来像这样:

@Getter
@Setter
public class Response {

    @JsonProperty("Result")
    private Result result;

}

Result 类来自外部库(与编写此端点的人员相同)。无论哪种方式,当我尝试通过 RestTemplate.exchange() 调用此端点时,Jackson 都无法将此 JSON 反序列化为有效的 Result 类。我这样做:

ResponseEntity<Response> response = restTemplate.exchange(url, HttpMethod.GET, null, Response.class);

执行 response.getBody() 会得到一个 Response 对象,其中包含一个空的 Result 对象。显然,Jackson 没有正确反序列化 JSON。我怀疑这是因为 API 返回的异常 text/x-json Content-Type。

我还有我的 MappingJackson2HttpMessageConverter 对象配置为能够解析 text/x-json 内容类型,但运气不好:

MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
jsonConverter.setSupportedMediaTypes(ImmutableList.of(new MediaType("text", "x-json")));
restTemplate.getMessageConverters().add(jsonConverter);

有什么建议吗?

更新:我不知道为什么这不起作用,但我找到了另一种方法 - 将 JSON 作为 Map 而不是域对象获取,这对我的目的来说已经足够好了.

最佳答案

默认 MappingJackson2HttpMessageConverter 绑定(bind)到:

  • 应用程序/json
  • 应用/*+json

我们需要添加text/x-json

MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
List<MediaType> jsonTypes = new ArrayList<>(jsonConverter.getSupportedMediaTypes());
jsonTypes.add(new MediaType("text", "x-json"));
jsonConverter.setSupportedMediaTypes(jsonTypes);

现在,我们应该在 RestTemplate 中使用它:

restTemplate.setMessageConverters(Collections.singletonList(jsonConverter));
ResponseEntity<RequestPayload> response = restTemplate.exchange(url, HttpMethod.GET, null, RequestPayload.class);

关于java - Jackson - 将 JSON 反序列化为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55285941/

相关文章:

java - Spring:使用构建器模式创建 bean

java - Spring - 如何用外部文件覆盖内部配置文件

java - 如何正确解决 Hudson 和 ant 的部署权限问题?

java - 构建成功,但运行时依赖在 Gradle 依赖中似乎很糟糕

java - maven项目中如何判断版本来自哪里?

php - 使用json/ajax时如何调试数据

java - GAE 应用程序在本地运行,但上传到谷歌服务器时无法运行

javascript - JSON 按名称分组然后显示最新记录

C: JSON 处理器

json - 如何解决由Many TO Many hibernate双向映射引起的json序列化器中的循环引用?