使用StringIO缓存读取JSON转Pandas DataFrame时出现Trailing data错误
问题原因
- 首要原因:你修改后的
pd.read_json调用丢失了原有逻辑的orient='records'参数,当JSON的顶级结构为列表时,部分pandas版本无法自动匹配解析规则,会抛出尾随数据错误。 - 高频原因:如果你的业务代码是在循环追加API结果的过程中,多次调用
json.dump向StringIO写入内容,会导致缓存中存在多段独立的JSON字符串拼接,不符合标准的单数组JSON格式,触发解析异常。 - 其他可能:如果你的数据包含中文、特殊转义字符,
StringIO的编码不匹配也可能导致JSON格式被破坏。
修复方案
方案1:最简优化(无需StringIO,性能最高)
你本身已经拿到了由字典组成的json_out列表,完全可以省略JSON序列化、IO缓存的中间步骤,直接转换为DataFrame:
import pandas as pd json_out = [] # 原有追加API结果的逻辑保持不变 df = pd.DataFrame(json_out)
方案2:保留JSON序列化逻辑的修复
如果你需要保留JSON序列化的环节(比如需要做格式校验等场景),直接添加缺失的orient参数即可:
import json import pandas as pd json_out = [] # 原有追加API结果的逻辑保持不变 df = pd.read_json(json.dumps(json_out), orient='records')
方案3:坚持使用StringIO缓存的修复
如果业务逻辑要求必须用StringIO做缓存,需要确保json.dump只在json_out完全组装完成后调用一次,同时指定orient参数:
from io import StringIO import json import pandas as pd io = StringIO() json_out = [] # 原有追加API结果的逻辑保持不变 # 【重要】等json_out全部元素追加完成后,一次性写入缓存,不要在循环里多次调用dump json.dump(json_out, io) # 两种读取方式二选一 # 方式1:移动文件指针到缓存开头后传入IO对象 io.seek(0) df = pd.read_json(io, orient='records') # 方式2:直接读取全部缓存内容 # df = pd.read_json(io.getvalue(), orient='records')
问题排查方法
如果修改后仍然报错,可以先打印序列化后的JSON内容,确认格式是否符合预期:
print(json.dumps(json_out, indent=2, ensure_ascii=False))
检查输出是否为完整的数组结构,不存在多段JSON拼接、转义字符异常的问题。
内容的提问来源于stack exchange,提问作者Chuck
相关产品推荐
相关产品推荐

