You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Jersey 2.27在客户端反序列化JSON数组

解决Jersey 2.27客户端反序列化text/plain类型JSON数组的问题

服务器返回text/plain但实际内容是JSON的情况确实挺常见的,这里有两种靠谱的方法帮你完成反序列化:

方法一:直接在读取响应时指定解析类型

这种方法不需要修改客户端全局配置,适合临时处理单个请求。你可以在调用readEntity的时候,明确告诉Jersey把响应内容当作application/json来解析,同时用GenericType来捕获泛型集合的类型(直接用ArrayList.class会丢失泛型信息,Jackson无法正确反序列化):

if (status == 200) {
    // 使用GenericType指定泛型集合类型,同时强制按JSON解析
    ArrayList<Person> persons = response.readEntity(
        new GenericType<ArrayList<Person>>() {}, 
        MediaType.APPLICATION_JSON_TYPE
    );
    return persons;
}

方法二:全局配置客户端支持text/plain类型的JSON解析

如果你的很多请求都会遇到这种情况,建议全局配置Jersey客户端,让Jackson自动处理text/plain类型的响应:

  1. 首先创建Jackson的Provider并添加text/plain媒体类型支持:
JacksonJsonProvider jacksonProvider = new JacksonJsonProvider();
// 让Jackson能处理text/plain类型的JSON
jacksonProvider.addMediaTypes(new MediaType("text", "plain"));
  1. 注册这个Provider到ClientConfig中,再创建客户端:
ClientConfig clientConfig = new ClientConfig();
clientConfig.register(jacksonProvider);
Client client = ClientBuilder.newClient(clientConfig);
// 之后用这个client创建WebTarget
WebTarget webTarget = client.target("your-base-url");
  1. 之后读取响应就可以直接用泛型类型了,不需要额外指定MediaType:
if (status == 200) {
    ArrayList<Person> persons = response.readEntity(new GenericType<ArrayList<Person>>() {});
    return persons;
}

注意点

  • 一定要用GenericType<ArrayList<Person>>而不是ArrayList.class,因为Java的类型擦除会让Jackson无法知道集合里的元素类型,导致反序列化失败。
  • 如果你的项目里还没引入Jackson相关依赖,确保已经添加了jersey-media-json-jackson依赖(Maven的话在pom.xml里添加对应的dependency)。

内容的提问来源于stack exchange,提问作者user9670036

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:36:01