如何使用 IJSON kvitem 访问 JSON 文件中的所有键?

问题描述

我正在使用 ijson.kvitems 迭代我拥有的 JSON 文件中的所有键。

JSON 文件如下所示:

{"filename":{"file_data":
{"name":"samplefile","filetype":"Miscellaneous","id":123,"timestamp":"2020-10-08 00:20:00"}}}

基于 this answer,我的代码的简化版本看起来像这样(v 也是一个字典):

import ijson

f = open('file.json')
for k,v in ijson.kvitems(f,''):
    name = v['name']
    user_id = v['id']
    filetype = v['filetype']
    timestamp = v['timestamp']

我只能以这种方式从原始文件中流式传输/读取大约 94% 的密钥,试图找出是否有办法获得剩余的 6%。

谢谢!!

解决方法

kvitems 的文档可能并不完全清楚:它返回给定前缀的键/值对,并且它不是递归的。使用您的示例文档和代码,这就是 kvitems 返回的内容(请注意,截至撰写本文时,ijson.dump 还没有出现在最新的 PyPI ijson 版本上,但在最新的 master 版本上可用GitHub):

echo '{
  "filename": {
    "file_data": {
      "name":"samplefile","filetype":"Miscellaneous","id":123,"timestamp":"2020-10-08 00:20:00"
    }
  }
}' | python -m ijson.dump -m kvitems
#: key,value
-------------
0: filename,{'file_data': {'name': 'samplefile','filetype': 'Miscellaneous','id': 123,'timestamp': '2020-10-08 00:20:00'}}

这里的 keyfilename,而 value 是对象的其余部分,因为整个对象是 filename 下的值。特别是像 namefiletype 这样的键不会单独报告;如果您希望报告这些(及其各自的值),则必须改用 filename.file_data 前缀。

根据原始问题中的评论,我猜这是实际问题,但无法在此处添加更广泛的评论以进一步澄清问题,并希望这也是您问题的实际答案。

>