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

JSON 字符串反斜杠问题

一、问题背景

在项目中,我们从 TCP 通道收到字符串消息,再通过 MQTT 转发到云端
然而,日志中发现:

  • 初始几次发送正常;

  • 随后出现大量 \\

  • 云端解析报错:Invalid url parameter

示例

第一次发送:
{"command":"/api/robot_status","extraData":"{\"channel\":\"rcs-app-executor\"}"}几轮之后:
{"command":"{\"command\":\"{\\\"command\\\":\\\"..."}  // 出现多层转义

问题:JSON 被多次序列化,出现“字符串套字符串”

二、JSON 与 String 的区别

类型本质表现形式是否需要转义
JSON 对象结构化数据{ "a":1 }
JSON 字符串纯文本"{"a":1}"✅ 是,需要 \" 保护内部引号
普通字符串任意字符"hello"

三、三个常见方法的区别(重点)

方法含义输入输出是否会增加反斜杠
gson.fromJson(text, Type)JSON → 对象JSON 文本对象❌ 否
gson.toJson(obj)对象 → JSON对象JSON 文本❌ 否
JsonParser.parseString(text).toString()解析→规范化JSON 文本干净 JSON❌ 否
🚫 gson.toJson(text)❌ 错误:把 JSON 当普通字符串JSON 文本"{"a":"b"}" → "{\"a\":\"b\"}"✅ 会!

四、错误原因剖析

错误写法:

GlobalMqttManager.publish(ctx, topic, gson.toJson(responseMessage))
  • responseMessage 已经是 "{"a":"b"}" 形式的 JSON 字符串;

  • 再 toJson() 一次,就相当于在外面再包一层引号

  • 每一轮都套一层 → 反斜杠越来越多 → 云端无法解析。

五、正确写法(推荐两种)

✅ 方法1:JsonParser规范化(最简单)

val payload = JsonParser.parseString(responseMessage).toString() GlobalMqttManager.publish(ctx, topic, payload)

特点:

  • 不再多一层引号;

  • 保证传递的是合法 JSON 文本

  • 无需定义数据类。

✅ 方法2:先解析对象,再一次性序列化(标准写法)

val gson = Gson() val env = gson.fromJson(responseMessage, Envelope::class.java) val payload = gson.toJson(env) GlobalMqttManager.publish(ctx, topic, payload)

特点:

  • 结构化访问字段;

  • 能对内容做校验、加工;

  • fromJson → toJson 各一次,永远不会“变花”。

六、记忆口诀 

  • fromJson:解析文本 → 对象

  • toJson:序列化对象 → 文本

  • parseString → toString:清洗/规范化文本

  • ✅ 对对象用 toJson

  • ✅ 对 JSON 字符串用 parseString().toString()

  • 🚫 千万别对 JSON 字符串再 toJson(String)

七、总结

场景正确做法
发送对象gson.toJson(obj)
收到 JSON 文本想解析gson.fromJson(text, Class)
收到 JSON 文本想原样转发JsonParser.parseString(text).toString()
❌ 千万不要gson.toJson(jsonText)

八、“决策口令”

  • 对象 → 文本gson.toJson(obj)

  • 文本 → 对象gson.fromJson(text, Type)

  • 文本 → 干净文本JsonParser.parseString(text).toString()

  • 已经是 JSON 的 String 想转发:可以直接发;更稳的是parse→toString 后再发绝不要gson.toJson(text) 再发。

http://www.dtcms.com/a/499982.html

相关文章:

  • 制作可以赚钱的网站doooor设计
  • 备案 网站名称 修改o2o的四种营销模式
  • 泰安企业建站公司排行广州番禺建网站
  • Java程序免安装JDK运行方案:内置JDK实现完全独立部署
  • ES 别名:核心用法与避坑
  • 建设工程交易中心官网十堰网站优化
  • 北仑网站建设培训学校wordpress编辑器模板
  • 7种python常见漏洞与大模型检测思路
  • 网站开发策略六安seo
  • NumPy zeros() 函数详解
  • 政务治理与战略决策总署——未来国策的“反脆弱”锻造熔炉系统
  • 第4讲:Go运行时系统剖析
  • 做外文翻译的网站深圳龙岗区地图全图
  • 安徽城乡建设 厅网站小企业网站如何建设好
  • Unity Addressables笔记
  • 重庆公司网站建设步骤5元购买已备案域名
  • 负载均衡spring-cloud-starter-openfeign教程
  • 怎么提高网站seo优化关键字排名龙岩一线网络有限公司
  • 采集的网站怎么做收录如何建设一个博客网站
  • 风车网站做花盆磨具附近的招聘工作
  • 影楼行业网站ui交互设计软件
  • 千享科技网站建设动画设计培训
  • 做网站怎么报价做门户网站主要技术哪一块
  • “每3度电就有1度是绿电”,西北如何利用数字孪生平台打造新能源建设新阵地
  • 进程地址空间二讲:程序是如何加载的?动态库又是如何加载的?
  • Go语言数据验证库详解:asaskevich/govalidator入门与实践
  • 营销型网站建设电话江苏省住房和建设厅网站
  • 有关做能源的网站泰宁县建设局网站
  • 英文网站建设cmswordpress 外部链接跳转
  • USB --SETUP --STATUS阶段