JSON parser raises IndexError on a top-level scalar value, failing document ingestion

当 RAGFlow 的文档解析任务遇到顶层为 JSON 标量值(如 42、"text"、true、3.14、null)的 .json/.jsonl/.ldjson 文件时,JSON 解析器会抛出未捕获的 IndexError,导致整份文档解析失败;应优先排查解析器是否已包含针对空路径的保护逻辑。

快速结论:当 RAGFlow 的文档解析任务遇到顶层为 JSON 标量值(如 42、”text”、true、3.14、null)的 .json/.jsonl/.ldjson 文件时,JSON 解析器会抛出未捕获的 IndexError,导致整份文档解析失败;应优先排查解析器是否已包含针对空路径的保护逻辑。

适用环境:Issue 已确认涉及 RAGFlow 的 deepdoc 解析模块(deepdoc/parser/json_parser.py)与文档解析入口 rag/app/naive.py;未明确给出操作系统、Python、CUDA 或显卡版本信息。

最快修复方案:暂无确认的一步修复方案;Issue 提到修复已随 #16877 合入,可优先尝试升级到包含该修复的版本,或按 Issue 描述在 _set_nested_dict 中为空路径增加保护后返回。

注意事项:Issue 未说明修复所在的具体版本号,升级后需先确认本地代码中 _set_nested_dict 是否已包含空路径判断;自行修改源码属于未在原 Issue 中逐行验证的做法,升级前应做好备份。

问题场景

用户在 RAGFlow 中上传语法合法、但顶层值为 JSON 标量的 .json、.jsonl 或 .ldjson 文档并触发文档解析任务。Issue 复现结果表明,顶层为 42、”hello”、true、3.14、null 时均会报错,而顶层为数组 [1,2,3] 或对象 {“a”:1} 时能正常解析。

报错原文

JSON parser raises IndexError on a top-level scalar value, failing document ingestion
IndexError: list index out of range

原因分析

根据 Issue 的调用链分析,顶层为标量时 is_jsonl_format() 因 json.loads(txt) 成功而返回 False,解析进入 _parse_json → split_json → _list_to_dict_preprocessing。预处理对标量不做转换,于是 _json_split(scalar, [], …) 走到只处理单条数据的 else 分支,调用 _set_nested_dict(chunks[-1], [], data),此时 current_path 为空列表,_set_nested_dict 中的 d[path[-1]] = value 对空列表取下标,触发 IndexError。

由于 rag/app/naive.py 中的 _parse_json 只捕获 json.JSONDecodeError,IndexError 会继续向上抛出,最终使整个解析任务失败。顶层列表不出问题,是因为预处理会把列表转换成以索引为键的字典,而标量没有这层转换。

环境排查

  • 确认使用的 RAGFlow 版本是否已包含 #16877 的修复。
  • 检查 deepdoc/parser/json_parser.py 中 _set_nested_dict 是否已对空 path 做返回处理。
  • 检查 rag/app/naive.py 的 _parse_json 异常捕获范围,确认是否仍只捕获 JSONDecodeError。
  • 确认待解析文档的顶层值类型是标量、数组还是对象,可先用等价输入判断是否稳定复现。

解决步骤

  1. 先确认问题是否与顶层标量输入直接相关:用顶层为 42、true 等标量的 JSON 文档触发解析,并确认报错为 IndexError 而非 JSONDecodeError。
  2. 可优先尝试升级到包含 #16877 修复的 RAGFlow 版本,升级后重新执行同一份文档的解析任务。
  3. 若暂时无法升级,可优先尝试在 _set_nested_dict 中为 path 为空的情况增加保护(直接返回,不再执行 path[-1] 取下标),然后重启解析服务并重试。
  4. 解析完成后检查任务状态与输出分块结果,确认标量文档不再导致任务失败。

验证方法

重新上传顶层为标量值的 JSON 文档(如 42、true、null),确认解析任务不再抛出 IndexError,且能够正常完成;同时用顶层为数组 [1,2,3] 和对象 {“a”:1} 的文档回归验证,确认原有解析行为未受影响。

参考来源

infiniflow/ragflow #15718

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 34549

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注