我有一个巨大的文件(几 GB 大小)。它有一个连接的 json,即几个 JSON 背靠背没有分隔符(甚至没有逗号或换行符)。有谁知道我可以以某种方式解析这个?当连接中的第二个 json 到达时,json.load(fileobj) 和 json.loads(line) 都失败并出现“额外数据”错误。如果解决方案由于尺寸巨大而允许字符流传输,那就更好了,但这不是必需的。编辑:连接的 json 是https://en.wikipedia.org/wiki/JSON_streaming#Concatenated_JSON_2
2 回答

繁花如伊
TA贡献2012条经验 获得超12个赞
逐字符读取文件,将结果写入文件。还要跟踪大括号缩进级别。
每当您读取一个}
使缩进级别为零的字符时,您就读取了整个 json 对象。关闭文件,用 加载它json.load()
,然后开始一个新文件。
但是,如果文件包含引号或转义}
字符,则此解决方案过于幼稚且行不通;你需要一个“真正的”解析器。

LEATH
TA贡献1936条经验 获得超7个赞
另一个答案建议跟踪缩进。这很难(尽管不如 XML 差)。
一个更简单的解决方案是意识到当它因“额外数据”而失败时,JSONDecodeError
异常包含一个pos
字段,该字段说明额外数据的开始位置。额外的数据是您的第二条信息。因此,您想重新解析之前的子字符串pos
。
递归解决方案来展示这个想法:
def parseConcatenatedJSON(s:str): try: json.loads(s) except json.JSONDecodeError as jde: head = s[0:jde.pos] json.loads(head) tail = s[jde.pos:] parseConcatenatedJSON(tail)
添加回答
举报
0/150
提交
取消