Python加载含None值的类字典字符串报JSONDecodeError的解决方法
标准JSON规范规定空值的固定写法为null,不支持Python原生的None关键字,因此直接调用json.loads()解析形如'{"a": None}'的Python风格类字典字符串时,会抛出JSONDecodeError: Expecting value: line 1 column 7 (char 6)异常。
方法1:字符串替换适配标准JSON(简单场景适用)
加载前先将字符串中的None替换为JSON标准的null,再走正常JSON解析流程即可:import json s = '{"a": None}' parsed_data = json.loads(s.replace("None", "null")) print(parsed_data) # 输出结果: {'a': None}注意:如果字符串本身的内容值里包含
None文本(例如'{"tip": "None means no value"}'),简单替换会篡改原有内容,这类场景不推荐用该方法。方法2:使用ast.literal_eval安全解析(推荐首选)
这类字符串本身完全符合Python原生字面量语法,直接用Python标准库ast的literal_eval方法即可解析,原生支持识别None、True、False等Python内置值,且不会执行任意代码,没有eval()的注入风险:import ast s = '{"a": None}' parsed_data = ast.literal_eval(s) print(parsed_data) # 输出结果: {'a': None} print(type(parsed_data["a"])) # 输出结果: <class 'NoneType'>该方法是处理此类Python风格类字典字符串的最优方案,无需提前做字符串替换,同时支持解析列表、元组、数字、字符串等常见Python字面量结构。禁止直接使用
eval()做解析,避免恶意代码执行风险。方法3:兼容非标准JSON的第三方库(复杂场景适用)
如果待解析的字符串还夹杂其他非标准JSON写法(比如单引号包裹键值、末尾多余逗号等),可以使用兼容宽松语法的JSON解析库处理:# 先安装依赖:pip install demjson3 import demjson3 s = '{"a": None}' parsed_data = demjson3.decode(s) print(parsed_data) # 输出结果: {'a': None}
内容的提问来源于stack exchange,提问作者Memphis Meng

