为Kafka Axon负载创建转义JSON对象:双重转义实现问询
如何生成双重转义的JSON负载(双重编组方案可行吗?)
嘿,这个问题我之前处理类似场景时刚好研究过,咱们来捋清楚怎么搞定~
首先明确你的需求:你需要把原始JSON {"new":{"Id":"1","Class":"23"}} 转换成所有双引号都被转义的格式 {\"new\":{\"Id\":\"1\",\"Class\":\"23\"}},本质上是把原始JSON字符串再做一次JSON转义,让它可以作为合法的文本值嵌入到其他JSON或代码中。
核心结论:双重编组(序列化)完全可行,而且是最严谨的方案
你猜的没错,通过两次序列化操作确实能实现这个需求,但得注意操作步骤,不能直接对原始对象做两次序列化,得按以下逻辑来:
- 第一次序列化:把你的原始对象转换成标准的JSON字符串(不带转义)
- 第二次序列化:把第一次得到的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
相关产品推荐
相关产品推荐

