You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为Kafka Axon负载创建转义JSON对象:双重转义实现问询

如何生成双重转义的JSON负载(双重编组方案可行吗?)

嘿,这个问题我之前处理类似场景时刚好研究过,咱们来捋清楚怎么搞定~

首先明确你的需求:你需要把原始JSON {"new":{"Id":"1","Class":"23"}} 转换成所有双引号都被转义的格式 {\"new\":{\"Id\":\"1\",\"Class\":\"23\"}},本质上是把原始JSON字符串再做一次JSON转义,让它可以作为合法的文本值嵌入到其他JSON或代码中。

核心结论:双重编组(序列化)完全可行,而且是最严谨的方案

你猜的没错,通过两次序列化操作确实能实现这个需求,但得注意操作步骤,不能直接对原始对象做两次序列化,得按以下逻辑来:

  1. 第一次序列化:把你的原始对象转换成标准的JSON字符串(不带转义)
  2. 第二次序列化:把第一次得到的JSON字符串当作普通文本处理,进行第二次序列化,这一步会自动转义字符串里的所有特殊字符(包括双引号)

举几个主流语言的实现例子

Python 实现

import json

# 原始对象
original_obj = {"new": {"Id": "1", "Class": "23"}}

# 第一步:序列化对象为普通JSON字符串
first_json = json.dumps(original_obj)
# 输出:'{"new": {"Id": "1", "Class": "23"}}'

# 第二步:对字符串做二次序列化,再去掉外层的双引号(如果不需要的话)
double_escaped_json = json.dumps(first_json)[1:-1]
# 最终结果:'{\"new\":{\"Id\":\"1\",\"Class\":\"23\"}}'

JavaScript 实现

const originalObj = { new: { Id: "1", Class: "23" } };

// 第一步:转成普通JSON字符串
const firstJson = JSON.stringify(originalObj);
// 输出:'{"new":{"Id":"1","Class":"23"}}'

// 第二步:二次序列化后截取掉外层引号
const doubleEscaped = JSON.stringify(firstJson).slice(1, -1);
// 最终结果:'{\"new\":{\"Id\":\"1\",\"Class\":\"23\"}}'

场景扩展:如果要把转义后的JSON作为其他JSON的字段值

比如你需要生成 {"data": "{\"new\":{\"Id\":\"1\",\"Class\":\"23\"}}"} 这样的负载,那直接把第一次序列化的结果作为字段值,再序列化整个父对象即可:

import json

inner_obj = {"new": {"Id": "1", "Class": "23"}}
payload = {"data": json.dumps(inner_obj)}
final_output = json.dumps(payload)
# 输出:'{"data":"{\"new\":{\"Id\":\"1\",\"Class\":\"23\"}}"}'

为什么不推荐手动替换双引号?

手动把 " 替换成 \" 看起来简单,但JSON规范里还有其他需要转义的字符(比如反斜杠\、换行符\n、制表符\t等),手动替换很容易遗漏,导致生成的内容不符合JSON标准。而双重序列化会自动处理所有需要转义的字符,更可靠。

注意事项

  • 直接对原始对象做两次序列化(比如json.dumps(json.dumps(original_obj)))会得到带外层双引号的结果,如果你需要的是不带外层引号的转义字符串,记得去掉那层引号(比如Python里的[1:-1],JS里的slice(1,-1))
  • 如果是作为其他JSON的字段值,外层双引号是必要的,因为它是字符串类型的字段值

内容的提问来源于stack exchange,提问作者Bhupinder Singh Narang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:22:33