Python发送JSON格式POST请求时如何正确保留转义反斜杠
问题原因
你看到的反斜杠“丢失”本质是认知误区导致的:
- Python字典的打印输出(即你看到的
{'id': '12345asdf', 'tag': '"8522e2de632040fc728440da7b23806a"'})是字典对象的原生内存表示,不是最终发出去的JSON报文。JSON规范要求字符串内的双引号必须用\转义,这层转义是序列化阶段自动添加的,不会提前出现在Python字典的存储值里。 - Python字符串字面量中
\"是转义序列,实际代表的字符是双引号"本身,如果你需要反斜杠作为tag值的业务内容,需要额外对反斜杠做转义。
解决方案
根据实际需求选择对应写法即可:
场景1:需要标准JSON格式(tag值为双引号包裹的字符串,和你给出的目标JSON一致)
这种情况核心逻辑本身是正确的,只是校验对象看错了。更推荐用requests自带的json参数发送请求,不需要手动做JSON序列化,还会自动设置正确的Content-Type: application/json请求头:
import requests data = {"id": "12345asdf", "tag": "\"8522e2de632040fc728440da7b23806a\""} resp = requests.post('https://site.com/splash', json=data) # 打印真实发送的请求体验证,输出和要求的目标数据完全一致 print(resp.request.body)
运行后打印的请求体里\\"是Python字节串的表示方式,实际报文内容就是\",完全符合JSON规范要求。
场景2:接口要求tag值本身包含反斜杠(反斜杠是业务内容,不是JSON转义符)
如果接口要求tag字段的实际内容就是\"8522e2de632040fc728440da7b23806a\"(反斜杠是值的一部分),定义字符串时需要对反斜杠本身做转义,两种写法都可以:
import requests # 写法1:手动转义反斜杠 data = {"id": "12345asdf", "tag": "\\\"8522e2de632040fc728440da7b23806a\\\""} # 写法2:用原始字符串避免转义混乱 # data = {"id": "12345asdf", "tag": r'\"8522e2de632040fc728440da7b23806a\"'} resp = requests.post('https://site.com/splash', json=data) print(resp.request.body)
注意事项
- 校验请求格式不要直接打印Python字典,最准确的方式是查看
response.request.body的实际内容,避免被不同场景下的转义规则误导。 - 不要手动拼接JSON字符串,也尽量不要自己传
data=json.dumps(xxx),用requests内置的json参数可以避免绝大多数JSON序列化格式问题。
内容的提问来源于stack exchange,提问作者le ra
相关产品推荐
相关产品推荐

