为何json.loads抛出JSONDecodeError: Expecting value错误?
问题原因与解决办法
核心问题:JSON语法规范与Python语法的差异
你的字符串j里的布尔值是Python风格的True(首字母大写),但JSON规范要求布尔值必须是小写的true/false,这才是解析失败的根本原因,和字符串长度无关。
为什么exec能正常运行?
exec('t = ' + j)是执行一段Python代码:
- 字符串里的
True是合法的Python布尔值,这段代码会把j解析成一个Python字典t - 后续调用
json.dumps(t)时,Python的json模块会自动把Python的True转换成JSON规范的true,因此能正常序列化输出。
为什么json.load(j)会报错?
首先,你用错了方法:json.load()是用来读取文件对象的,处理字符串应该用json.loads()。但就算改成json.loads(j),依然会报错,因为:
- JSON解析器严格遵循JSON语法,不识别大写的
True,遇到不符合规范的语法就会抛出JSONDecodeError。
解决办法
把字符串中的True替换成JSON规范的true,再用json.loads()解析:
import json j = '{"type":"x","key":"A","attributes":{"label":"test","visible":True,"advancedOptions":True},"fees":[{"type":"set","key":"fee","attributes":{"amount":"5","type":"percent","label":"Test","fee":{"value":"7","type":"percent"},"visible":True}}]}' # 替换Python风格的布尔值为JSON规范的布尔值 j_fixed = j.replace("True", "true") # 用loads解析字符串 t = json.loads(j_fixed) print(json.dumps(t, indent=4))
如果这个字符串是从其他系统/接口获取的,建议让数据生成方直接输出符合JSON规范的格式,从源头避免这类问题。
内容的提问来源于stack exchange,提问作者Raksha
相关产品推荐
相关产品推荐

