为了账号安全,请及时绑定邮箱和手机立即绑定

Python:解析连接的 JSON

Python:解析连接的 JSON

慕工程0101907 2022-11-01 15:58:07
我有一个巨大的文件(几 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(),然后开始一个新文件。

但是,如果文件包含引号或转义}字符,则此解决方案过于幼稚且行不通;你需要一个“真正的”解析器。


查看完整回答
反对 回复 2022-11-01
?
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)


查看完整回答
反对 回复 2022-11-01
  • 2 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号