[已解决] HttpMessageNotReadableException: JSON parse error: Unexpected character

news2024/10/11 18:35:14

[已解决] HttpMessageNotReadableException: JSON parse error: Unexpected character

文章目录

    • 写在前面
    • 问题描述
      • 报错原因分析:
    • 解决思路
    • 解决办法
      • 1. 检查并修复客户端的 JSON 数据格式
      • 2. 确认请求头的 Content-Type 设置正确
      • 3. 捕获并处理 HttpMessageNotReadableException 异常
      • 4. 校验客户端传递的数据是否是 JSON
      • 5. 确保客户端和服务端使用相同的字符编码
      • 6. 检查网络传输问题
    • 总结

写在前面

在使用 Spring MVC 或 Spring Boot 进行 API 开发时,当客户端向服务端发送无效的 JSON 数据时,可能会抛出如下异常:

HttpMessageNotReadableException: JSON parse error: Unexpected character

该异常通常表示传递给服务器的 JSON 数据格式错误,导致服务器无法解析。本文将对此问题进行深入分析,并提供详细的解决方案。

在这里插入图片描述

问题描述

报错代码行:

HttpMessageNotReadableException: JSON parse error: Unexpected character

报错原因分析:

  1. 无效的 JSON 格式:客户端请求的 JSON 数据存在语法错误,例如缺少引号、逗号或括号。
  2. 字符编码错误:客户端使用了错误的字符集,导致服务端无法正确解析数据。
  3. 传递了非 JSON 数据:如果客户端发送的请求数据不是有效的 JSON(如普通文本、XML 等),也会触发此异常。
  4. Content-Type 错误:请求头中的 Content-Type 不是 application/json,导致服务器尝试以错误的格式解析数据。
  5. 数据传输中损坏:网络传输问题导致部分数据丢失或损坏,导致 JSON 数据无法正常解析。

解决思路

  1. 检查 JSON 格式:首先检查客户端传递的 JSON 数据格式是否正确,确保其符合标准 JSON 格式。
  2. 确认字符编码:确保客户端和服务器都使用了相同的字符集,常用的是 UTF-8
  3. 验证请求头 Content-Type:确保请求头的 Content-Type 设置为 application/json
  4. 处理非 JSON 数据:如果客户端发送的不是 JSON 数据,需要在服务器端添加数据格式校验,防止发送非 JSON 格式时直接抛出异常。
  5. 捕获并处理异常:在服务端捕获该异常并返回明确的错误信息给客户端,提示其检查请求数据格式。

解决办法

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

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

  • 缺少或多余的引号:
    {name: "John", age: 30}  // 错误,键 "name" 需要引号
    {"name": "John", "age": 30}  // 正确
    
  • 缺少逗号或多余的逗号:
    {"name": "John" "age": 30}  // 错误,两个键之间缺少逗号
    {"name": "John", "age": 30}  // 正确
    

使用在线的 JSON 校验工具(如 JSONLint)来校验 JSON 数据的正确性。

2. 确认请求头的 Content-Type 设置正确

确保客户端发送的请求头中包含以下内容:

Content-Type: application/json

如果 Content-Type 未设置为 application/json,服务端可能尝试使用其他格式来解析请求数据,从而导致解析失败。可以通过以下代码在请求中设置正确的 Content-Type:

fetch('https://api.example.com/data', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({ name: 'John', age: 30 })
});

3. 捕获并处理 HttpMessageNotReadableException 异常

为了防止在解析 JSON 数据时抛出未处理的异常,建议在服务端捕获 HttpMessageNotReadableException,并返回自定义的错误信息。可以在 Spring Boot 的控制器类中使用 @ExceptionHandler 来捕获并处理该异常:

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(HttpMessageNotReadableException.class)
    public ResponseEntity<String> handleHttpMessageNotReadableException(HttpMessageNotReadableException ex) {
        String errorMessage = "Invalid JSON format: " + ex.getMessage();
        return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST);
    }
}

这将返回更加友好的错误信息,并引导客户端检查他们的请求数据格式。

4. 校验客户端传递的数据是否是 JSON

如果存在客户端可能传递非 JSON 数据的情况,可以在服务端增加数据校验逻辑,确保接收到的请求数据是 JSON 格式。可以使用以下代码在处理请求之前验证其是否为合法的 JSON:

public boolean isValidJson(String json) {
    try {
        final ObjectMapper mapper = new ObjectMapper();
        mapper.readTree(json);
        return true;
    } catch (IOException e) {
        return false;
    }
}

5. 确保客户端和服务端使用相同的字符编码

客户端和服务端应确保使用相同的字符集进行数据传输,通常为 UTF-8。可以在 Spring Boot 中通过以下配置强制设置字符编码:

spring:
  http:
    encoding:
      charset: UTF-8
      enabled: true
      force: true

6. 检查网络传输问题

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

总结

HttpMessageNotReadableException 异常通常是由于客户端传递了无效的 JSON 数据或请求头配置错误引起的。通过检查 JSON 数据格式、确认请求头设置、捕获并处理异常等措施,可以有效解决该问题并改善客户端与服务器的交互体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2205469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三层b+树估算存储多少行数据

文章目录 B树结构图示估算方法(这里要以聚簇索引来看) B树结构图示 估算方法(这里要以聚簇索引来看) 非叶子节点数* 每个叶子结点记录总数 假设mysql 数据页&#xff0c;16kb&#xff0c;刚好对应B树的一个节点 每个叶子结点记录数&#xff0c; 叶子结点存储的是对应的原始数据…

项目常用版本控制管理工具

不仅仅是代码管理工具 gitHubgitcodeSVN gitHub https://github.com/ github gitcode https://gitcode.com/ gitcode SVN 图片: 带尺寸的图片: 居中的图片: 居中并且带尺寸的图片:

git--git reset

HEAD 单独一个HEAD eg:git diff HEAD 表示当前结点。 HEAD~ HEAD~只处理当前分支。 注意&#xff1a;master分支的上一个结点是tmp分支的所在的结点fc11b74, 79f109e才是master的第二个父节点。 HEAD~ 当前结点的父节点。 HEAD~1 当前结点的父节点。 HEAD~n 当前结点索…

Python 工具库每日推荐 【easyocr】

文章目录 引言Python OCR 工具库的重要性今日推荐:EasyOCR 工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:多语言名片信息提取案例分析高级特性自定义模型训练处理倾斜文本扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript…

Qt实现侧边栏功能

本文介绍Qt实现侧边栏功能。 采用Qt进行界面应用程序开发时&#xff0c;经常遇到侧边栏功能实现&#xff0c;采用侧边栏可以将一些暂时不用到的功能隐藏&#xff0c;使用的时候点击一下相应的按钮即可弹出&#xff08;动画方式&#xff09;功能菜单。减少主界面控件数量&#…

JS | JS中类的 prototype 属性和__proto__属性

大多数浏览器的 ES5 实现之中&#xff0c;每一个对象都有__proto__属性&#xff0c;指向对应的构造函数的prototype属性。Class 作为构造函数的语法糖&#xff0c;同时有prototype属性和__proto__属性&#xff0c;因此同时存在两条继承链。 构造函数的子类有prototype属性。‌ …

搭建知识库:助力大健康零售电商的快速发展

一、大健康零售电商行业的快速发展及其对知识库的需求 随着互联网技术的飞速发展和人们对健康意识的显著提升&#xff0c;大健康零售电商行业迎来了前所未有的发展机遇。这一行业不仅涵盖了传统零售业的商品销售&#xff0c;还融入了健康管理、健康咨询、健康数据分析等多元化…

『网络游戏』数据库表格转储【25】

避免勿删数据库表格&#xff0c;可以将表格存储 放到桌面即可 现在将表格删除后点击 浏览桌面表格保存即可 修改客户端脚本&#xff1a;NetSvc.cs 目的是在数据库更新异常时弹出提示以便修改 本章结束

使用 Helsinki-NLP 中英文翻译本地部署 - python 实现

通过 Helsinki-NLP 本地部署中英文翻译功能。该开源模型性价比相对高&#xff0c;资源占用少&#xff0c;对于翻译要求不高的应用场景可以使用&#xff0c;比如单词&#xff0c;简单句式的中英文翻译。 该示例使用的模型下载地址&#xff1a;【免费】Helsinki-NLP中英文翻译本…

Pura 70系列和Pocket 2已支持升级尝鲜鸿蒙NEXT,报名教程在这里

相信不少关注鸿蒙 NEXT 的人都知道&#xff0c;10月8日起&#xff0c;华为开启了鸿蒙 NEXT 系统的公测&#xff0c;但有不少人不知道的是&#xff0c;除了公测的 Mate 60 和 Mate X5 两个系列的机型&#xff0c;还有两个系列的手机其实也可以提前升级体验鸿蒙 NEXT 系统。 Pur…

随时随地一键开播的云微客实景直播神器,你想要吗?

AI实景直播系统正在以自动化、智能化的特性&#xff0c;逐渐成为直播行业的新宠。在众人频繁使用手机的时代背景下&#xff0c;直播已经成为了大多数人娱乐的方式之一&#xff0c;然而传统的直播方式不仅操作繁琐而且人员成本也高&#xff1b;现在云微客实景直播不仅可以告别人…

在工业现场,数据采集相关的对象一般有哪些类型?

在工业现场&#xff0c;数据采集相关的对象一般有以下类型&#xff1a;一、设备运行参数类1.温度 —描述&#xff1a;反映设备的发热情况、工作环境温度等&#xff0c;对于一些对温度敏感的设备&#xff08;如电子设备、精密机械等&#xff09;至关重要。 —举例&#xff1a;在…

企业注册资金如何实缴?步骤与方式详解

在企业的发展过程中&#xff0c;注册资金实缴是一个重要的环节。它不仅体现了企业的实力和信誉&#xff0c;也为企业的经营活动提供了坚实的资金保障。那么&#xff0c;在 2024 年&#xff0c;企业注册资金实缴的步骤和方式有哪些呢&#xff1f; 一、企业注册资金实缴步骤 1、确…

[C语言]结构体

1.什么是结构体 结构是多种类型的数据的集合。。且每个结构成员都有名字&#xff0c;因此当使用特定的成员时需要指明结构体成员的名字。 2.结构体的声明 以学生的数据为例&#xff1a; struct student //student结构名{char name; //name结构体成员名int height;…

传知代码-自动车牌识别检测系统(论文复现)

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 YOLO V8实现多种车牌检测识别&#xff01; 一、概述 使用yolov8进行车牌检测&#xff08;训练测试演示部署&#xff09; 二、支持类型 我们的车牌识别检测系统支持多种类型的车牌 具体支持类型如下&#xff1a…

云渲染农场可以用哪些CG软件!

随着数字内容创作的需求日益增长&#xff0c;3D艺术家们不断寻求更高效、更强大的渲染解决方案。云渲染农场以其灵活性和可扩展性&#xff0c;成为了许多创作者的首选。这些平台支持多种流行的CG软件&#xff0c;如Maya、3ds Max、Cinema 4D、Blender等&#xff0c;以及各种插件…

go 语言学习路线图

1. Go语言简介 Go语言的历史背景和设计理念Go的优势&#xff1a;简洁、高效、并发支持强Go的应用场景&#xff1a;微服务、云计算、系统编程 2. 开发环境设置 安装Go语言开发环境 在Windows、macOS、Linux系统上的安装方法 配置环境变量&#xff1a;GOROOT 和 GOPATH验证安装…

认知战认知作战:作战机构深陷的两大战略误解阵营

认知战认知作战&#xff1a;作战机构深陷的两大战略误解阵营 认知战认知作战&#xff1a;作战机构深陷的两大战略误解阵营 关键词&#xff1a;认知战, 认知作战, 作战机构, 如临大敌派, 水到渠成派, 战略误解, 务实之道,认知作战,新质生产力,人类命运共同体,认知战,认知域,认…

ROS理论与实践学习笔记——5 ROS机器人系统仿真之URDF集成Rviz基本流程

实现流程&#xff1a; &#xff08;1&#xff09;创建功能包&#xff0c;导入依赖 创建一个新的功能包&#xff0c;名称自定义&#xff0c;导入依赖包&#xff1a;urdf与xacro。 在当前功能包下&#xff0c;再新建几个目录&#xff1a; urdf: 存储 urdf 文件的目录 meshes:机…

如何使用ssm实现办公OA系统0

TOC 10907ssm办公OA系统10907ssm0 第一章 绪 论 1.1背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于办公OA系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;主页、个人中心、公司公告管理、设备分类管理、办公设备管理、…