
本文讲解如何在 Python 中将一个 JSON 对象安全地序列化为字符串,并作为字段值嵌入另一个 JSON 对象中,确保内部 JSON 的双引号被正确转义为 ",满足 REST API 对嵌套 JSON 字符串格式的严格要求。
本文讲解如何在 python 中将一个 json 对象安全地序列化为字符串,并作为字段值嵌入另一个 json 对象中,确保内部 json 的双引号被正确转义为 `"`,满足 rest api 对嵌套 json 字符串格式的严格要求。
在构建与外部 REST API 交互的请求体时,常遇到一种特殊需求:需将一段合法 JSON 数据作为字符串值嵌入到外层 JSON 中,且该字符串内部的双引号必须显式表示为 "(即单个反斜杠 + 双引号),而非原始的 "。例如,API 期望接收如下结构:
{
"json_string": "{"name": "John", "age": 30}"
}
而非:
{
"json_string": "{"name": "John", "age": 30}" // ❌ 语法错误
}
或带多余转义的版本:
{
"json_string": "{\"name\": \"John\", \"age\": 30}" // ❌ 过度转义(Python 字符串显示层面)
}
关键误区在于:手动调用 .replace('"', '"') 或拼接字符串进行“伪转义”是不可靠的——它破坏了 JSON 的语义完整性,且易受换行、特殊字符(如反斜杠、控制字符)影响,最终导致外层 json.dumps() 再次转义,产生 "(显示为 \"),不符合 API 接收规范。
✅ 正确做法是:交由 json.dumps() 分层处理。每层 json.dumps() 负责其作用域内的标准 JSON 序列化与转义,天然保证安全性与合规性。
✅ 推荐方案:双重 json.dumps()
import json
# 原始数据
data = {"name": "John", "age": 30, "city": "New York"}
# 第一层:将 data 序列化为 JSON 字符串(自动转义内部双引号)
inner_json_str = json.dumps(data) # → '{"name": "John", "age": 30, "city": "New York"}'
# 第二层:将包含 inner_json_str 的字典再次序列化
# 此时 inner_json_str 作为字符串值,其内部引号会被 json.dumps 自动转义为 "
dataone = json.dumps({"json_string": inner_json_str})
print(dataone)
# 输出:
# {"json_string": "{"name": "John", "age": 30, "city": "New York"}"}
? 注意:
dataone是一个JSON 格式的字符串(非 Python 字典)。若需发送至 API,可直接作为requests.post(json=...)的 payload;若需打印可读格式,可加indent=2:print(json.dumps({"json_string": json.dumps(data)}, indent=2))
⚠️ 重要注意事项
-
不要手动替换引号:
str.replace('"', '\"')绕过了 JSON 编码器,无法处理、、\、"hello"world"等边界情况,极易引发解析失败。 -
避免混淆“显示”与“实际内容”:Python REPL 或
print(repr(...))显示\"是字符串在 Python 中的表示形式,不代表 JSON 实际内容含两个反斜杠。真正发送到网络的是符合 JSON 标准的"。 -
如需嵌套多层 JSON(例如三层),继续套用
json.dumps(json.dumps(json.dumps(...)))即可,但应评估设计合理性——多数场景只需两层。 -
验证输出合法性:可用
json.loads(dataone)反向解析验证是否能无损还原:restored = json.loads(dataone) assert json.loads(restored["json_string"]) == data # ✅ 成功
通过分层调用 json.dumps(),你既遵循了 JSON 规范,又精准满足了 API 对嵌套字符串中引号转义格式的要求,是简洁、健壮且可维护的标准实践。











