You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:45:06