Python使用Format拼接字符串遇KeyError,如何动态生成Payload?
解决Payload动态数据添加的KeyError问题
哦,这个问题我之前也碰到过!你遇到的KeyError是因为str.format()的解析规则在搞事情——它会把字符串里所有的{}都当成占位符来处理,而你写的JSON模板里的外层大括号没有转义,所以它误以为{ "name":...里的{是某个占位符的开头,找不到对应的键就报错了。而静态字符串没用到format(),Python不会去解析里面的大括号,所以能正常运行。
下面给你几个靠谱的解决方案:
方法1:转义JSON模板里的大括号
把JSON结构里的每个{换成{{,每个}换成}},这样format()会把双大括号解析成单个大括号,只替换你指定的{0}、{1}占位符:
payload = "{{\n \"name\": \"{0}\",\n \"id\":\"{1}\"\n}}".format(1,2)
运行后生成的结果就是正确的JSON字符串:
{ "name": "1", "id":"2" }
方法2:用json模块生成推荐!
手动拼接JSON字符串很容易出错,尤其是处理复杂数据或者特殊字符的时候,用Python内置的json模块才是正道:
import json # 先构造Python字典 data = { "name": 1, "id": 2 } # 把字典转成格式化后的JSON字符串 payload = json.dumps(data, indent=2)
这种方法不仅不用处理任何转义问题,还能自动保证JSON格式的正确性,比如值里有引号、换行符的时候,会自动帮你转义,非常省心。
方法3:用f-string(Python3.6+)
如果你的Python版本支持f-string,也可以用这种更简洁的写法,同样需要转义大括号:
name = 1 id_val = 2 # 注意不要用id当变量名,它是Python内置关键字 payload = f"{{\n \"name\": \"{name}\",\n \"id\":\"{id_val}\"\n}}"
内容的提问来源于stack exchange,提问作者Mr Singh
相关产品推荐
相关产品推荐

