npm 遇到ijson.common.IncompleteJSONError后继续迭代到下一条json记录

rta7y2nd  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(127)

我有一个很大的json文件(大约11,600条记录),我试图使用ijson来解析它。然而,for循环因为一条错误的json记录而中断。有没有一种方法可以通过跳过该记录并使用ijson或任何其他python库来继续迭代?下面是代码片段。

try:
      for row in ijson.items(json_file, 'rows.item'):
        data = row
        try:
            super_df=dependency_latest_version(data, version)
        except Exception as e:
            print(e)
except ijson.common.IncompleteJSONError:
    traceback.print_exc()

这将生成以下错误:

for row in ijson.items(json_file, 'rows.item'):
ijson.common.IncompleteJSONError: parse error: after array element, I expect ',' or ']'
          dmeFilename":"README.md"}}":{"integrity":"sha512-204Fg2wwe1Q
                     (right here) ------^

我尝试逐行迭代json文件,然后使用json.loads(line),但它没有帮助,因为整个json文件被作为一行读取。还有其他替代方案吗?谢谢。

bnlyeluc

bnlyeluc1#

有没有一种方法可以通过跳过该记录并使用ijson [...]继续迭代?
ijson:不是。
虽然对你来说很明显,在数组中的一个错误元素上,你应该跳转到 * 有 * 一个下一个元素,但对于底层解析器来说,这样的语句并不明显:如果有一个解析错误,你不知道从哪里开始修复。因为没有可用的修复,解析器不能对接下来的事情做任何进一步的假设,所以没有更多的概念存在下一个元素,或一个新对象,或任何东西,因为你处于无效状态。解析器唯一能做的就是给予。
在您的情况下,您得到的错误消息(由yajl库发出,ijson内部使用)表示它期望,]分别继续或结束一个没有正确继续或结束的元素列表(并且注意,这样的列表不一定是您正在迭代的列表,很难从原始问题中分辨出来,因为没有显示示例JSON文档)。你不能期望解析器自动处理错误,并“跳到下一个元素”,因为,就像前面提到的,解析器不能猜测流的其余部分应该是什么。
还有其他选择吗?
虽然我维护ijson并且不知道其他库的具体情况,但我很确定它们都有类似的问题。你最好的办法是在文档生成的地方修复它。或者,如果你确切地知道你的问题在哪里,你可以在传递给ijson之前“修补”文档;请https://github.com/ICRAR/ijson/issues/33#issuecomment-698266199https://github.com/ICRAR/ijson/issues/25#issuecomment-610214101注意,严格地说,你不是在给一个JSON文档,你正在处理一个看起来非常像JSON文档的文档。

相关问题