Python内置解析



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

[
{ "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. 检查第三个对象,而不将其全部放入内存。如果我再次进行CCD_ 1;数据";数组将被读取到内存中并变成dict,我想避免它。

  2. 在不将数据数组全部加载到内存的情况下检查数据数组。如果我不在乎其他钥匙,我可以这么做:

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

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

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

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

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

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)

最新更新