首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python ijson -嵌套解析

Python ijson -嵌套解析
EN

Stack Overflow用户
提问于 2021-05-10 09:23:59
回答 1查看 539关注 0票数 1

我正在处理JSON的web响应,它看起来像这样(简化了,我无法更改格式):

代码语言:javascript
复制
[
   { "type": "0","key1": 3, "key2": 5},
   { "type": "1","key3": "a", "key4": "b"},
   { "type": "2", "data": [<very big array here>] }
]

我想做两件事:

  1. 检查前两个对象而不将所有内容读入内存,我可以使用Ijson来完成这一任务:
代码语言:javascript
复制
parsed = ijson.items(res.raw, 'item')
next(parsed) # first item
next(parsed) # second item
  1. 检查第三个对象而不将其全部存储在内存中。如果我再次执行next(parsed),所有的“数据”数组都将被读取到内存中,并转换为一个dict,我希望避免它。
  2. 检查数据数组,而不将其全部加载到内存中。如果我不关心其他的钥匙,我可以这么做:
代码语言:javascript
复制
parsed = ijson.items(res.raw, 'item.data.item') # iterator over data's items

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

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

我也可以用一个可以做得更好的库来代替ijson。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-11 13:22:25

您需要使用ijson的事件拦截机制。基本上,通过使用ijson.parse将解析逻辑降一级,直到您到达大数组,然后切换到与其他parse事件一起使用ijson.items。这使用字符串文字,但应该说明这一点:

代码语言:javascript
复制
import ijson

s = b'''[
   { "type": "0","key1": 3, "key2": 5},
   { "type": "1","key3": "a", "key4": "b"},
   { "type": "2", "data": [1, 2, 3] }
]'''
parse_events = ijson.parse(s)
while True:
    path, name, value = next(parse_events)
    # do stuff with path, name, data, until...
    if name == 'map_key' and value == 'data':
        break
for value in ijson.items(parse_events, 'item.data.item'):
    print(value)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67467897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档