[已办理] HttpMessageNotReadableException: JSON parse error: Unexpected ...

打印 上一主题 下一主题

主题 1863|帖子 1863|积分 5589

[已办理] HttpMessageNotReadableException: JSON parse error: Unexpected character



  
写在前面

在使用 Spring MVC 或 Spring Boot 进行 API 开辟时,当客户端向服务端发送无效的 JSON 数据时,可能会抛出如下异常:
  1. HttpMessageNotReadableException: JSON parse error: Unexpected character
复制代码
该异常通常表现转达给服务器的 JSON 数据格式错误,导致服务器无法解析。本文将对此标题进行深入分析,并提供详细的办理方案。

标题描述

报错代码行:
  1. HttpMessageNotReadableException: JSON parse error: Unexpected character
复制代码
报错原因分析:


  • 无效的 JSON 格式:客户端哀求的 JSON 数据存在语法错误,例如缺少引号、逗号或括号。
  • 字符编码错误:客户端使用了错误的字符集,导致服务端无法正确解析数据。
  • 转达了非 JSON 数据:假如客户端发送的哀求数据不是有效的 JSON(如平凡文本、XML 等),也会触发此异常。
  • Content-Type 错误:哀求头中的 Content-Type 不是 application/json,导致服务器尝试以错误的格式解析数据。
  • 数据传输中损坏:网络传输标题导致部门数据丢失或损坏,导致 JSON 数据无法正常解析。
办理思路


  • 检查 JSON 格式:起首检查客户端转达的 JSON 数据格式是否正确,确保其符合标准 JSON 格式。
  • 确认字符编码:确保客户端和服务器都使用了雷同的字符集,常用的是 UTF-8。
  • 验证哀求头 Content-Type:确保哀求头的 Content-Type 设置为 application/json。
  • 处置惩罚非 JSON 数据:假如客户端发送的不是 JSON 数据,需要在服务器端添加数据格式校验,防止发送非 JSON 格式时直接抛出异常。
  • 捕捉并处置惩罚异常:在服务端捕捉该异常并返回明白的错误信息给客户端,提示其检查哀求数据格式。
办理办法

1. 检查并修复客户端的 JSON 数据格式

当遇到此类错误时,起首应该检查客户端发送的 JSON 数据是否格式正确。常见的错误包罗:


  • 缺少或多余的引号:
    1. {name: "John", age: 30}  // 错误,键 "name" 需要引号
    2. {"name": "John", "age": 30}  // 正确
    复制代码
  • 缺少逗号或多余的逗号:
    1. {"name": "John" "age": 30}  // 错误,两个键之间缺少逗号
    2. {"name": "John", "age": 30}  // 正确
    复制代码
使用在线的 JSON 校验工具(如 JSONLint)来校验 JSON 数据的正确性。
2. 确认哀求头的 Content-Type 设置正确

确保客户端发送的哀求头中包含以下内容:
  1. Content-Type: application/json
复制代码
假如 Content-Type 未设置为 application/json,服务端可能尝试使用其他格式来解析哀求数据,从而导致解析失败。可以通过以下代码在哀求中设置正确的 Content-Type:
  1. fetch('https://api.example.com/data', {
  2.     method: 'POST',
  3.     headers: {
  4.         'Content-Type': 'application/json'
  5.     },
  6.     body: JSON.stringify({ name: 'John', age: 30 })
  7. });
复制代码
3. 捕捉并处置惩罚 HttpMessageNotReadableException 异常

为了防止在解析 JSON 数据时抛出未处置惩罚的异常,发起在服务端捕捉 HttpMessageNotReadableException,并返回自界说的错误信息。可以在 Spring Boot 的控制器类中使用 @ExceptionHandler 来捕捉并处置惩罚该异常:
  1. @RestControllerAdvice
  2. public class GlobalExceptionHandler {
  3.     @ExceptionHandler(HttpMessageNotReadableException.class)
  4.     public ResponseEntity<String> handleHttpMessageNotReadableException(HttpMessageNotReadableException ex) {
  5.         String errorMessage = "Invalid JSON format: " + ex.getMessage();
  6.         return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST);
  7.     }
  8. }
复制代码
这将返回更加友好的错误信息,并引导客户端检查他们的哀求数据格式。
4. 校验客户端转达的数据是否是 JSON

假如存在客户端可能转达非 JSON 数据的情况,可以在服务端增加数据校验逻辑,确保接收到的哀求数据是 JSON 格式。可以使用以下代码在处置惩罚哀求之前验证其是否为正当的 JSON:
  1. public boolean isValidJson(String json) {
  2.     try {
  3.         final ObjectMapper mapper = new ObjectMapper();
  4.         mapper.readTree(json);
  5.         return true;
  6.     } catch (IOException e) {
  7.         return false;
  8.     }
  9. }
复制代码
5. 确保客户端和服务端使用雷同的字符编码

客户端和服务端应确保使用雷同的字符集进行数据传输,通常为 UTF-8。可以在 Spring Boot 中通过以下配置强制设置字符编码:
  1. spring:
  2.   http:
  3.     encoding:
  4.       charset: UTF-8
  5.       enabled: true
  6.       force: true
复制代码
6. 检查网络传输标题

假如确认客户端 JSON 数据格式正确且服务器配置无误,仍然出现该错误,可能是网络传输中数据被损坏。可以使用网络抓包工具(如 Wireshark)检查数据是否在传输过程中被修改或截断。
总结

HttpMessageNotReadableException 异常通常是由于客户端转达了无效的 JSON 数据或哀求头配置错误引起的。通过检查 JSON 数据格式、确认哀求头设置、捕捉并处置惩罚异常等措施,可以有效办理该标题并改善客户端与服务器的交互体验。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表