Python解析JSON时使用f-string插入变量报格式错误如何解决
错误根源
f-string 语法中,单大括号{}是用来包裹待解析Python表达式的标记,如果要在f-string最终输出里保留字面意义的大括号,必须连续写两个大括号{{/}}做转义。
原代码里JSON结构本身的外层大括号没有做转义,f-string会把JSON对象的整段大括号内容识别为格式化表达式,解析时找不到合法的格式说明符,就会抛出ValueError: Invalid format specifier错误。
而且手动用f-string拼接JSON本身容错率极低,一旦变量是包含引号、换行、特殊字符的字符串,很容易生成非法格式的JSON,不推荐作为首选方案。
推荐实现方案
优先通过「构造Python原生数据结构 + json模块序列化」的方式生成JSON,完全规避大括号转义、特殊字符处理的问题:
import json test = 10 # 先构建Python原生列表、字典结构,变量直接正常赋值即可 raw_data = [ { "ID": test, "Name": "Pankaj", "Role": "CEO" } ] # 序列化为标准合法JSON字符串,所有格式转义由json模块自动处理 json_data = json.dumps(raw_data) json_object = json.loads(json_data) json_formatted_str = json.dumps(json_object, indent=2) print(json_formatted_str)
运行后输出:
[ { "ID": 10, "Name": "Pankaj", "Role": "CEO" } ]
这种方式不管变量是数字、字符串、布尔值还是嵌套的列表、字典,json模块都会自动匹配JSON类型规则、转义特殊字符,不会出现格式错误,是生成JSON的标准做法。
f-string 临时适配方案
如果场景非常简单,确实需要直接用f-string写JSON模板,只需要把所有属于JSON语法的字面量大括号双写转义,仅在插入变量的位置保留单大括号即可:
import json test = 10 # JSON本身的大括号全部双写转义,变量插入位置用单大括号 json_data = f'[{{"ID": {test},"Name":"Pankaj","Role":"CEO"}}]' json_object = json.loads(json_data) json_formatted_str = json.dumps(json_object, indent=2) print(json_formatted_str)
注意:该方案仅适合结构固定、变量类型简单的场景,如果变量为字符串类型,手动包裹引号时很容易因为变量内含特殊字符导致JSON解析失败,复杂场景不要使用。
内容的提问来源于stack exchange,提问作者GVV
相关产品推荐
相关产品推荐

