Python用f-string格式化含动态变量的JSON报错解决方法
问题原因
报错和f-string语法规则相关,不是该场景不能用f-string,也不是JSON业务逻辑错误,核心问题有三个:
- f-string会将所有单个的
{、}识别为插值表达式的边界标记,你写的JSON结构里所有对象外层的大括号都没有转义,Python解析时会把大括号包裹的JSON键(比如"custId":)当成格式说明符解析,直接触发ValueError: invalid format specifier报错。 - 你要插入的
pass_over是字符串类型,直接插值到JSON结构中不会自动带双引号,最终生成的内容里custId对应的值是无引号的000067895,属于非法JSON格式(数字不允许前导零,且你需要的是字符串类型的值)。 - 数组最后一个元素后面多了多余的尾逗号,严格JSON解析器遇到这种多余逗号会直接报格式错误。
修复方案
方案1:坚持用f-string手动拼接(不推荐)
f-string中如果要输出字面量大括号,需要写双大括号转义:{{输出单个{,}}输出单个},同时给字符串类型的插值内容补双引号、去掉多余尾逗号,修正后代码如下:
pass_over = '000067895' tester = f'''{{ "custId": "{pass_over}", "acctStatusCriterion": [ {{ "acctType": "YY", "acctStatus": "Open" }}, {{ "acctType": "VV", "acctStatus": "Open" }} ], "incExtAcctInfoFlag": true }}'''
注意:手动拼接JSON需要自行处理类型转换、转义、特殊字符转义(比如pass_over里如果包含双引号、反斜杠会直接导致JSON格式损坏),出错概率极高。
方案2:用标准库序列化(官方推荐,零格式错误)
直接用Python内置的json模块构造字典后序列化生成JSON字符串,从根源上避免所有手动拼接的格式问题,不需要记转义规则,模块会自动处理类型转换、特殊字符转义、格式合规性:
import json pass_over = '000067895' # 先构造Python原生字典结构 payload = { "custId": pass_over, "acctStatusCriterion": [ { "acctType": "YY", "acctStatus": "Open" }, { "acctType": "VV", "acctStatus": "Open" } ], "incExtAcctInfoFlag": True } # 序列化为合法JSON字符串 tester = json.dumps(payload)
这种写法下,不管pass_over后续变动为字符串、数字、布尔值还是其他可序列化类型,json模块都会自动转换为符合规范的JSON格式,还会自动处理Python布尔值(首字母大写True/False)和JSON布尔值(小写true/false)的差异,不需要手动调整。
内容的提问来源于stack exchange,提问作者Baba
相关产品推荐
相关产品推荐

