【问题标题】:How Can I Access All of The Keys in a JSON File Using IJSON kvitems?如何使用 IJSON kvitems 访问 JSON 文件中的所有密钥?
【发布时间】:2021-08-21 05:58:18
【问题描述】:

我正在使用 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%。

谢谢!!

【问题讨论】:

  • 请发帖minimal reproducible example,包括。导入和示例输入 JSON。询问有关场外资源的建议在 SO 上是题外话。
  • 我想帮忙,但从问题中不清楚确切的问题是什么。在您的示例中,哪些键无法读取?该示例本身似乎也是错误的,因为kvitems 中的空路径应为k 生成filename,而该键下的对象为v
  • AFAIK,空路径应该允许访问字典中的所有键(文件名),并且 v 应该包含嵌套字典 ({"file_data": {"name":...} }),这就是我使用 kvitems 的方式。我的问题是,在 ijson.kvitems(f, '') 中迭代 k, v 时,并非所有的 Ks(即文件名)都包含在迭代器中。
  • 对不起,但确切的问题仍然不清楚(至少对我来说)。您能否修改示例 JSON 文档和测试代码以准确显示缺少哪些键?另请注意,您在示例代码中索引到 v 的方式不适用于给定的 JSON 文档,因为访问应该类似于 v['file_data']['name']
  • 我无法确定缺少哪些键,因为它们有几十万个,并且迭代需要很长时间(数据在远程仓库中,长篇大论)。关于访问 - 我理解它的方式,作为“文件名”键的值 - v is 'file_data' - 你无法访问 v['file_data']。我错过了什么?再次感谢...

标签: python jsonparser ijson


【解决方案1】:

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

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 前缀。

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

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多