为什么Spring Boot写入Redis的中文转为JSON后变成了转义字符?

老丽大大_7902

老丽大大_7902

2026-10-26

489人浏览

原创

Jackson 默认启用 ESCAPE_NON_ASCII 特性将中文转为\u4f60\u597d形式,以确保JSON在任意编码环境下安全解析;可通过配置ObjectMapper关闭该特性,同时需避免StringRedisTemplate与RedisTemplate混用及类型丢失问题。

为什么spring boot写入redis的中文转为json后变成了转义字符?

不是 Redis 或 Spring Boot 故意转义,而是 Jackson 默认对非 ASCII 字符做 Unicode 转义(\uXXXX),这是它的默认安全行为。

为什么 Jackson 会把中文变成 \u4f60\u597d 这种形式?

Jackson 的 ObjectMapper 默认启用 JsonGenerator.Feature.ESCAPE_NON_ASCII,目的是保证 JSON 字符串在任意编码环境下都能被安全解析。比如 HTTP header、旧版终端、某些 JS 环境不支持 UTF-8 字节流时,用 \u 形式最稳妥。

这不是 bug,是设计选择;但对调试、日志、Redis CLI 查看确实不友好。

  • Redis 里存的确实是合法 JSON,只是“可读性差”
  • redis-cli get mykey 显示 \u4f60\u597d,不代表取出来后 Java 对象有问题
  • 只要反序列化时用的是同一个 ObjectMapper,还原出来的字符串仍是正确的中文

如何让 Jackson 输出原始中文而不是 \uXXXX?

在配置 RedisTemplate 用的 GenericJackson2JsonRedisSerializer 或 Jackson2JsonRedisSerializer 时,必须显式关闭该特性:

Json Repair Kit
Json Repair Kit

使用 Node.js 评估修复格式错误的 JSON,自动纠正尾随逗号、单引号、未加引号的键等常见问题,实现文件规范化。

下载
ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, false); // 关键
// 后续再传给 serializer

如果你用的是 Spring Boot 自动配置的 RedisTemplate,需自定义 bean:

  • 不要直接改 application.yml 里的 valueSerializer 类名——它不接受参数
  • 必须写 Java 配置类,new 出带配置的 ObjectMapper,再套进 GenericJackson2JsonRedisSerializer
  • 注意:GenericJackson2JsonRedisSerializer 构造函数可传 ObjectMapper,而 Jackson2JsonRedisSerializer<t></t> 也可传入已配置好的实例

StringRedisTemplate 和 RedisTemplate 混用导致的“假乱码”

常见错误是:用 StringRedisTemplate 存了 JSON 字符串(比如 stringRedisTemplate.opsForValue().set("k", jsonStr)),却用 RedisTemplate 去取(或反之)。两者底层序列化器完全不同:

  • StringRedisTemplate:key/value 都走 StringRedisSerializer(UTF-8 字节直传)
  • RedisTemplate(默认):key/value 默认走 JdkSerializationRedisSerializer,若你配成 Jackson,则 key 仍可能被序列化为字节流(除非你也配了 StringRedisSerializer 给 key)
  • 混用会导致取出来是乱码字节或 ClassCastException,看起来像“转义”,实则是序列化协议错位

真正要警惕的不是转义,而是类型丢失

即使关掉了 ESCAPE_NON_ASCII,如果没配好反序列化类型信息,取出来还是 LinkedHashMap 而不是你的实体类。尤其是用 GenericJackson2JsonRedisSerializer 时:

  • 它会在 JSON 里自动加 @class 字段,但 Spring Boot 2.6+ 默认禁用 DefaultTyping,导致该字段被忽略
  • 更稳的方式是用 Jackson2JsonRedisSerializer<yourclass></yourclass>,明确指定类型
  • 或者确保 ObjectMapper 开启了白名单 + 安全的 DefaultTyping(如 OBJECT_AND_NON_FINAL),而非 NON_FINAL 全局开放

转义字符只是表象,类型擦除和序列化器错配才是线上缓存失效、取值失败的真正高发原因。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

redis js json spring boot

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2671

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

477

25

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

4496

8

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.28

1375

5

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1798

5

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

2023.08.17

10063

11

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

980

4

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2804

5

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.14

1589

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习