Python-ijson嵌套解析

Python-ijson嵌套解析,python,json,parsing,ijson,Python,Json,Parsing,Ijson,我正在处理一个JSON的web响应,它看起来像这样(简化了,我不能更改格式): [ {“类型”:“0”,“键1”:3,“键2”:5}, {“类型”:“1”,“键3”:“a”,“键4”:“b”}, {“类型”:“2”,“数据”:[]} ] 我想做两件事: 检查前两个对象而不将所有内容读取到内存中,我可以使用Ijson执行此操作: 检查第三个对象,但不将其全部存入内存。 如果我再次执行next(parsed),所有的“数据”数组都将被读取到内存中并转换为dict,我希望避免它 检查数据阵列,而不

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

[
{“类型”:“0”,“键1”:3,“键2”:5},
{“类型”:“1”,“键3”:“a”,“键4”:“b”},
{“类型”:“2”,“数据”:[]}
]
我想做两件事:

  • 检查前两个对象而不将所有内容读取到内存中,我可以使用Ijson执行此操作:
  • 检查第三个对象,但不将其全部存入内存。 如果我再次执行
    next(parsed)
    ,所有的“数据”数组都将被读取到内存中并转换为dict,我希望避免它

  • 检查数据阵列,而不将其全部加载到内存中。如果我不在乎其他钥匙,我可以做到:

  • 问题是,我需要在同一条流上完成所有这些操作

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

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

    您需要使用ijson的。基本上,通过使用
    ijson.parse
    在解析逻辑中降低一个级别,直到找到大数组,然后切换到使用
    ijson.items
    和其余的
    parse
    事件。这使用了字符串文字,但应说明以下要点:

    导入ijson
    s=b''[
    {“类型”:“0”,“键1”:3,“键2”:5},
    {“类型”:“1”,“键3”:“a”,“键4”:“b”},
    {“类型”:“2”,“数据”:[1,2,3]}
    ]'''
    parse_events=ijson.parse
    尽管如此:
    路径、名称、值=下一步(解析_事件)
    #对路径、名称、数据进行处理,直到。。。
    如果名称='map_key'和值='data':
    打破
    对于ijson.items(解析_事件'item.data.item')中的值:
    打印(值)
    
    能够重复使用
    items
    调用中的
    parse_events
    对象是我所缺少的一部分。
    parsed = ijson.items(res.raw, 'item')
    next(parsed) # first item
    next(parsed) # second item
    
    parsed = ijson.items(res.raw, 'item.data.item') # iterator over data's items