无法修改JSON文件时,如何处理JSON空值引发的Python解析错误?
解决无法修改的不规范JSON文件读取问题
作为Python新手,我尝试读取一个包含不规范内容的test.json文件,文件内容如下:
{ "empty_char":"", "empty_number": , "char":"i'm a char", "number":0 }
我用这段代码读取:
import json with open('test.json') as f: data = json.load(f)
结果抛出了这个错误:
Traceback (most recent call last): File "<input>", line 2, in <module> File "C:\ProgramData\Anaconda3\Lib\json\__init__.py", line 299, in load parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw) File "C:\ProgramData\Anaconda3\Lib\json\__init__.py", line 354, in loads return _default_decoder.decode(s) File "C:\ProgramData\Anaconda3\Lib\json\decoder.py", line 339, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "C:\ProgramData\Anaconda3\Lib\json\decoder.py", line 357, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 3 column 19 (char 39)
后来发现问题出在"empty_number": ,这行——这是不规范的JSON空值写法,可我没办法修改这个JSON文件,该怎么解决这个错误呢?
别担心,这种情况在处理第三方提供的JSON文件时很常见,我们可以通过预处理内容或者使用容错解析工具来解决,给你几个实用的方案:
方法一:简单字符串替换(适合单一不规范场景)
如果你的JSON里只有key: ,这种固定格式的不规范空值,直接用字符串替换就能搞定,把不合法的: ,替换成JSON标准的: null,:
import json with open('test.json', 'r', encoding='utf-8') as f: # 先读取文件全部内容 raw_content = f.read() # 替换不规范的空值写法 corrected_content = raw_content.replace(': ,', ': null,') # 解析修正后的合法JSON data = json.loads(corrected_content) print(data)
要是你的JSON里冒号和逗号之间有空格(比如"empty_number": ,),只要把替换的字符串改成: ,就行,灵活调整一下就好。
方法二:正则表达式替换(适配多种不规范格式)
如果不规范的写法有多种形式(比如冒号后有空格、换行、制表符等),用正则表达式能更精准地匹配并修正:
import json import re with open('test.json', 'r', encoding='utf-8') as f: raw_content = f.read() # 匹配所有"键名": 后面直接跟逗号的情况,替换成"键名": null, # \s*匹配任意数量的空白字符(空格、换行、制表符都算) corrected_content = re.sub(r'("[\w_]+"):\s*,', r'\1: null,', raw_content) data = json.loads(corrected_content) print(data)
这个正则能覆盖绝大多数类似的空值不规范写法,适用性更强。
方法三:使用容错JSON解析库(适合大量不规范内容)
如果你的JSON文件除了空值问题还有其他不规范的地方(比如无引号的键、末尾逗号等),可以试试第三方的容错解析库,比如json5:
首先安装库:
pip install json5
然后用下面的代码读取文件:
import json5 with open('test.json', 'r', encoding='utf-8') as f: data = json5.load(f) print(data)
json5支持很多JSON标准不允许的语法,专门用来处理这种“不标准”的JSON文件,省心又省力。
内容的提问来源于stack exchange,提问作者Everton Reis
相关产品推荐
相关产品推荐

