如何使用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类型的响应:
- 首先创建Jackson的Provider并添加
text/plain媒体类型支持:
JacksonJsonProvider jacksonProvider = new JacksonJsonProvider(); // 让Jackson能处理text/plain类型的JSON jacksonProvider.addMediaTypes(new MediaType("text", "plain"));
- 注册这个Provider到ClientConfig中,再创建客户端:
ClientConfig clientConfig = new ClientConfig(); clientConfig.register(jacksonProvider); Client client = ClientBuilder.newClient(clientConfig); // 之后用这个client创建WebTarget WebTarget webTarget = client.target("your-base-url");
- 之后读取响应就可以直接用泛型类型了,不需要额外指定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
相关产品推荐
相关产品推荐

