当前位置: 首页 > article >正文

Redis 存储 String高亮显示JSON,存储 JSON 的标准工具方法

RedisInsight 是通过“能不能成功解析为结构化 JSON”的方式来判断一个字符串是否是 JSON,只要它的格式不规范(如转义符太多、缺少大括号、非法字符等),它就会当成普通字符串(string)处理。所以可能会出现这个写的是json,那个写着string

这是个非常典型的 RedisInsight 使用中让人误解的现象,我来一针见血地解释清楚


✅ 问题核心

为什么前一张图(attachmentId:660_chunk_98)类型显示是 STRING,这一张图(default:xxx)显示是 JSON?它们到底有啥区别?


✅ 真相:Redis 中这两者本质上都是 String 类型

区别只是 RedisInsight 的 UI 对值内容做了自动判断和标签标记,不是 Redis 数据类型的实际差异!


🧠 解释原因

显示实际 Redis 类型UI 显示原因
STRINGString值是普通字符串格式,或 JSON 但未被 RedisInsight 自动识别为结构化 JSON
JSON还是 String值是结构化的 JSON,RedisInsight 自动识别并高亮为 JSON 结构(即:以 {} 开头、能成功 parse)

你看图里右侧的数据,实际上它是:

json

{ "totalChunks": 199, "embedding": [...], "attachmentId": 660, "chunkIndex": 107, "content": "..." }

所以 RedisInsight 给它打了一个 "JSON" 标签,并高亮成 JSON 样式。


✅ 举个例子更形象

这两个 Redis 键:

 

redis

SET key1 "{\"id\":1,\"name\":\"Tom\"}" // RedisInsight 可能显示为 STRING SET key2 "{ \"id\": 1, \"name\": \"Tom\" }" // RedisInsight 会显示为 JSON

虽然本质上 都是 String 类型,但格式不同导致 UI 展示不同。


🔍 你的两个截图对比总结:

RedisInsight 类型显示实际数据类型内容
attachmentId:660_chunk_98STRINGStringJSON 字符串,但可能转义或格式没被 UI 自动识别
default:fda45041...JSONStringJSON 字符串,被 RedisInsight 自动识别为结构化 JSON

✅ 如何验证和理解这个事实?

你可以在 Redis CLI 里查看这两个键:

 

bash

TYPE attachmentId:660_chunk_98 # 返回: string TYPE default:fda45041-36c6-4cdb-9152-2660344709a4 # 返回: string

再用 GET key 看看,都是 JSON 字符串,但 UI 展示不同而已。


✅ 结论总结

项目说明
RedisInsight 中的 “JSON” 是 UI 识别标签并不是 Redis 数据类型
实际 Redis 类型是 String不管你存的是文本、XML、JSON,都属于 Redis 的 String 类型
展示不同只因格式差异RedisInsight 能 parse 成结构化 JSON,就会显示为“JSON”标签,否则就是“STRING”
Redis 不理解你的内容它只存字符串,不知道什么是 JSON,除非你用 RedisJSON 模块

需要我帮你做个工具类来判断并规范 Redis 存储的 JSON 格式吗?或者你对 Redis JSON 存储有进一步需求(如按字段查询)?我可以帮你设计更合适的结构或模块用法。

🧠 更深入理解:JSON vs String 的本质区别

维度JSON 字符串(可被识别)普通字符串(不可识别)
Redis 数据类型都是 String 类型都是 String 类型
UI 显示标签JSON(结构化高亮)STRING(纯文本)
内容要求必须是合法的 JSON 格式(如:{"key":"value"}任意文本,包括半结构化、不完整、转义混乱的 JSON
解析行为RedisInsight 会自动格式化、折叠节点、支持复制字段只显示原始文本,无法结构化展示
常见写法ObjectMapper.writeValueAsString(obj) 后的 JSON手写拼接、或 JSON 被多重转义后格式变乱

🧪 示例对比

✅ 正确 JSON(会被识别)

 

json

{ "id": "abc123", "text": "这是正文内容", "chunkIndex": 3 }

👉 RedisInsight 显示为 JSON 类型,可点击折叠、查看结构。


❌ 不规范 JSON(不会被识别)

 

json

"{\"id\":\"abc123\",\"text\":\"这是正文内容\",\"chunkIndex\":3}"

  • 这是 字符串中的 JSON,被序列化了两次(或手动转义太多)
  • RedisInsight 无法 parse 成结构,就认为你只是放了个字符串

👉 显示为 STRING


✅ 为什么你会出现这种差异?

原因可能是:

原因解释
使用了 ObjectMapper.writeValueAsString() 两次一次就够了,第二次会把引号也变成转义符
存入 Redis 时人为拼接了字符串导致格式不规范,比如 JSON 不完整、缺右括号等
JSON 被包在字符串中(如 "value":"{\"key\":\"val\"}"这是 “JSON in String”,不是结构化 JSON

🔧 如何修正:确保 JSON 可被识别

如果你希望存进去的值 RedisInsight 能识别为 JSON,只做一次序列化,例如:

 

java

// 正确方式(只做一次 JSON 序列化) String json = objectMapper.writeValueAsString(documentChunk); redisTemplate.opsForValue().set("your:key", json);

⚠️ 不要这样写:

 

java

// 错误:写了两次序列化,导致变成嵌套字符串 String json = objectMapper.writeValueAsString(documentChunk); String doubleJson = objectMapper.writeValueAsString(json); // ❌ 多了一次


✅ 最终总结

项目JSONSTRING
Redis 类型都是 String都是 String
能否被 RedisInsight 识别是结构化 JSON 且格式正确格式不合法或是转义后的字符串
UI 效果可折叠查看字段只展示原始文本
推荐做法保证值是标准 JSON(只序列化一次)避免嵌套序列化或手工拼接 JSON

如果不确定代码里哪里二次序列化了,可以相关 set() 操作的代码,可以分析是哪一段导致的。 Redis 存储 JSON 的标准工具方法


http://www.kler.cn/a/610386.html

相关文章:

  • 华为OD机试A卷 - 积木最远距离(C++ Java JavaScript Python )
  • 【前端扫盲】node.js npm nvm都是什么以及他们之间的关系
  • 海底高铁--差分
  • react组件中useRef声明的变量和let声明的变量区别
  • 清华大学第十二版!!《机器语言大模型赋能软件自主可控与安全可信》
  • linux的基础命令
  • redis 缓存穿透
  • Spring Boot网站性能优化全解析
  • 浏览器渲染原理与优化详解
  • 【redis】哨兵节点作用演示和重选主节点详细流程
  • 简单方法胜过大语言模型?!单细胞扰动敲除方法的实验
  • Rust从入门到精通之入门篇:5.控制流
  • AOA与TOA混合定位,MATLAB例程,自适应基站数量,三维空间下的运动轨迹,滤波使用EKF
  • Git 是什么
  • AI日报 - 2025年3月27日
  • 【解锁 Oracle OCP:数据库专家的进阶之路】
  • Jetpack LiveData 使用与原理解析
  • 关于服务器只能访问localhost:8111地址,局域网不能访问的问题
  • SQL语句---特殊查询
  • 蓝桥杯算法实战分享