pandas读取JSON文件报解码意外字符ValueError如何解决
问题根因
报错核心原因是待读取的JSON文件本身不符合语法规范,和pandas组件无关。
你提供的JSON内容中,键b的取值是字符串形式的{"c": 2},但字符串内部的双引号没有做转义,和JSON结构用来标记边界的双引号产生了冲突:
错误片段:"b": "{"c": 2}"
JSON解析器读到这段时,会把"b": "{后面的第二个双引号判定为字符串结束标记,后续的c就成了无意义的意外字符,直接抛出ValueError: Unexpected character found when decoding object value解码错误。
排查步骤
- 优先用Python标准库定位精确错误位置:不要直接用pandas读取,先用内置
json模块加载文件,报错信息会给出明确的错误行列号,比pandas的报错提示更精准:
import json with open("你的文件路径.json", "r", encoding="utf-8") as f: json.load(f)
执行后抛出的错误会类似Expecting ',' delimiter: line 3 column 9 (char 24),直接对应未转义双引号的具体位置。
- 对照JSON语法规范校验:JSON要求字符串内部的双引号必须加反斜杠
\转义,否则会被识别为JSON结构的边界符号,重点检查所有字符串类型值里是否存在未转义的双引号、未闭合的括号等问题。
解决方案
根据你对b字段的实际业务需求,二选一即可:
方案1:修正源JSON文件(优先推荐)
如果b字段本身就是要存储嵌套结构化对象,不需要额外套字符串引号,直接删除多余的外层引号,写成合法JSON格式:
{ "a": "1", "b": {"c": 2} }
如果b字段确实需要存储字符串格式的JSON内容,就把字符串内部的所有双引号用反斜杠转义:
{ "a": "1", "b": "{\"c\": 2}" }
修正完成后,直接调用pandas.read_json()即可正常读取。
方案2:代码层面兼容(适用于源文件无法修改的场景)
如果源文件是第三方生成、无法直接修改,可以先按纯文本读取内容,手动修正格式错误后再加载为DataFrame:
import pandas as pd import json # 先读取原始文本内容 with open("你的文件路径.json", "r", encoding="utf-8") as f: raw_content = f.read() # 根据实际错误场景选择修正逻辑 # 场景1:b字段应为嵌套对象,直接去掉错误包裹的字符串引号 fixed_content = raw_content.replace('"{', '{').replace('}"', '}') # 场景2:b字段确实要存字符串JSON,转义内部双引号 # fixed_content = raw_content.replace('"{"c": 2}"', '"{\\"c\\": 2}"') # 加载为DataFrame df = pd.read_json(fixed_content) # 如果b是字符串化JSON,可后续单独转成结构化对象 df["b"] = df["b"].apply(json.loads)
注意:如果JSON文件体积大、格式错误不固定,不要用硬编码字符串替换的方式处理,建议逐行做语法校验修正,避免替换逻辑误伤正常内容。
内容的提问来源于stack exchange,提问作者You know who
相关产品推荐
相关产品推荐

