You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:48:31