MismatchedInputException异常求助:Java HTTP请求JSON解析失败
解决Jackson解析时的“No content to map due to end-of-input”异常
这个异常本质是Jackson尝试解析JSON时,发现输入流已经到了末尾,没有可解析的内容。下面是具体排查和解决方法:
1. 先确认服务器是否返回有效JSON
发送请求后,先检查HTTP响应状态码,如果是4xx(客户端错误)或5xx(服务器错误),服务器大概率不会返回预期的JSON,甚至返回空响应。可以先把响应体打印出来验证:
// 发送请求后,先读取响应体并打印 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; StringBuilder responseBody = new StringBuilder(); while ((line = reader.readLine()) != null) { responseBody.append(line); } reader.close(); System.out.println("服务器返回内容:" + responseBody.toString());
如果输出为空,说明服务器没返回数据,需要检查请求参数、接口地址是否正确,或者联系后端确认接口逻辑。
2. 检查请求体的发送逻辑
如果是POST请求,确保请求体正确写入并刷新:
OutputStream outputStream = connection.getOutputStream(); outputStream.write(postData.getBytes(StandardCharsets.UTF_8)); outputStream.flush(); outputStream.close(); // 写完后关闭输出流,不影响读取响应
如果没调用flush(),可能请求体没完全发送到服务器,导致服务器返回空响应。
3. 不要重复读取响应流
Jackson的ObjectMapper.readValue(InputStream, Class)会一次性读完整个流,如果之前已经用BufferedReader读取过流(比如上面的打印操作),流的指针会停在末尾,再次解析就会报这个错。解决方法是把响应体保存为字符串,再用字符串解析:
String responseStr = responseBody.toString(); YourResponseBean responseBean = objectMapper.readValue(responseStr, YourResponseBean.class);
4. 处理空响应的边界情况
如果业务上服务器允许返回空响应,要先判断响应内容是否为空,再决定是否解析:
if (responseBody.length() == 0) { // 处理空响应,比如返回默认对象或抛出业务异常 } else { YourResponseBean responseBean = objectMapper.readValue(responseBody.toString(), YourResponseBean.class); }
5. 确认Jackson依赖版本一致
Maven中要保证jackson-core、jackson-databind等依赖的版本统一,避免版本冲突导致解析异常:
<dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 用稳定的最新版本,确保所有Jackson依赖版本相同 --> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.15.2</version> </dependency> </dependencies>
内容的提问来源于stack exchange,提问作者Ara
相关产品推荐
相关产品推荐

