将JSON转换为CSV时出现json.decoder.JSONDecodeError错误,使用errors='ignore'参数仍无法忽略JSON文件乱码问题
我明白你遇到的困扰了——虽然用了errors='ignore'试图跳过乱码,但还是触发了JSONDecodeError,核心原因是**errors='ignore'会直接丢弃非法UTF-8字节,这可能破坏了JSON的语法结构**(比如删掉了字符串的闭合引号、逗号等关键字符),导致JSON解析器无法识别完整的结构。
举个例子,你提供的JSON示例里的åå¾·å是非法UTF-8序列,errors='ignore'会直接删掉这些字节,但如果刚好删掉了字符串结尾的引号,就会出现"Unterminated string"的错误。
解决方案:改用errors='replace'并优化代码
我们可以用errors='replace'把非法字符替换成�(不会破坏JSON结构),同时优化代码的文件管理和路径问题:
import csv import json import sys def trans(): # 注意:路径开头的是不可见的控制字符,要去掉! json_path = 'C:/Users/jeri/Desktop/1.json' csv_path = 'C:/Users/jeri/Desktop/1.csv' # 用with语句自动管理文件,避免手动close的问题 with open(json_path, 'r', encoding='utf-8', errors='replace') as jsonData, \ open(csv_path, 'w', encoding='utf-8', newline='') as csvfile: writer = csv.writer(csvfile, delimiter=',') flag = True for line in jsonData: # 先清理行首尾的空白字符(比如换行、空格) line = line.strip() if not line: continue try: dic = json.loads(line) if flag: keys = list(dic.keys()) print(keys) writer.writerow(keys) flag = False # 处理null值,避免写入CSV时出现空值问题 values = [v if v is not None else '' for v in dic.values()] writer.writerow(values) except json.JSONDecodeError as e: print(f"跳过解析失败的行:{line},错误信息:{e}") continue if __name__ == '__main__': trans()
关键改进点说明:
替换
errors='ignore'为errors='replace':
这样非法字符会被替换成�,既保留了JSON的语法结构,又不会因为丢弃字节破坏字符串的完整性,JSON解析器就能正常解析。清理路径中的隐藏字符:
你的代码里路径开头有个不可见的控制字符,这会导致Python找不到文件,一定要删掉。用
with语句管理文件:
不需要手动调用close(),Python会自动处理文件的打开和关闭,避免资源泄漏。增加异常处理:
对解析失败的行进行捕获和跳过,避免整个程序崩溃,同时打印错误信息方便排查。处理
null值:
JSON中的null在CSV中会显示为空,我们可以显式替换成空字符串,让输出更规范。
测试你提供的JSON示例,用这个代码可以正常解析并生成CSV,乱码会被替换成�,但不会影响结构解析。
内容的提问来源于stack exchange,提问作者jeri teri

