Python ijson - 嵌套解析

时间:2021-05-10 09:23:59

标签: python json parsing ijson

我正在处理一个看起来像这样的 JSON 网络响应(已简化,我无法更改格式):

[
   { "type": "0","key1": 3, "key2": 5},
   { "type": "1","key3": "a", "key4": "b"},
   { "type": "2", "data": [<very big array here>] }
]

我想做两件事:

  1. 检查前两个对象而不将所有内容读取到内存中,我可以使用 Ijson 执行此操作:
parsed = ijson.items(res.raw, 'item')
next(parsed) # first item
next(parsed) # second item
  1. 检查第三个对象而不将其全部放入内存。 如果我再次执行 next(parsed),所有“数据”数组都将被读取到内存并变成一个字典,我想避免它。

  2. 检查数据数组而不将其全部加载到内存中。如果我不关心其他键,我可以这样做:

parsed = ijson.items(res.raw, 'item.data.item') # iterator over data's items

问题是,我需要在同一个流中完成所有这些操作。

理想情况下,将第三个对象作为类似文件的对象接收会很棒,我可以再次将其传递给 ijson,但这似乎超出了该 API 的范围。

我也可以用可以做得更好的库替换 ijson。

1 个答案:

答案 0 :(得分:1)

您需要使用 ijson 的 event interception mechanism。基本上通过使用 > Web app > main.py >website >__init__.py >auth.py >models.py >views.py >templates >base.html >login.html >home.html >sign-up.html 在解析逻辑中向下一级,直到遇到大数组,然后切换到对其余 ijson.parse 事件使用 ijson.items。这使用了字符串文字,但应该说明这一点:

parse