【问题标题】:Reading in string of nested JSON lists and dictionaries with Python使用 Python 读取嵌套 JSON 列表和字典的字符串
【发布时间】:2016-08-06 14:07:36
【问题描述】:

我在 python 中读取数据时遇到问题。其中一行的样本是:

foo_brackets='{"KEY2":[{"KEY2a":[{"KEY2a1":"4","KEY2a2":"5"},{"KEY2a1":"6","KEY2a2":"7"}],"KEY2b":"8"}],"KEY3":"9"}'

当我使用json 加载时,KEY2 的值作为列表读入,因为括号,这会阻止我获得我想要的结果,即KEY2b 的值:

>>> import json
>>> foo_brackets_json=json.loads(foo_brackets)
>>> foo_brackets_json['KEY2']['KEY2b']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not str

我可以尝试删除括号,但实际上有一个值应该是一个列表,KEY2a。如果我去掉所有括号并尝试转换为 JSON,您可以看到这一点:

>>> foo_no_brackets='{"KEY2":{"KEY2a":{"KEY2a1":"4","KEY2a2":"5"},{"KEY2a1":"6","KEY2a2":"7"},"KEY2b":"8"},"KEY3":"9"}'
>>> json.loads(foo_no_brackets)
# Traceback omitted since it's just the python error
ValueError: Expecting property name: line 1 column 45 (char 45)

foo_brackets 似乎是有效的 JSON(我测试了here,去掉了引号)并得到以下信息:

{
   "KEY2":[
      {
         "KEY2a":[
            {
               "KEY2a1":"4",
               "KEY2a2":"5"
            },
            {
               "KEY2a1":"6",
               "KEY2a2":"7"
            }
         ],
         "KEY2b":"8"
      }
   ],
   "KEY3":"9"
}

问题:

有没有办法让我读取像foo_brackets 这样的对象,以便我可以调用foo_brackets_json['KEY2']['KEY2b']

【问题讨论】:

  • 使用foo_brackets_json['KEY2'][0]['KEY2b']有什么问题?
  • 为什么你认为这些括号是“额外的”?正如您所发现的,它们是有效的 JSON,它们表示 list。它们不是“额外的”,除了您似乎不期望除了 1 个这样的嵌套字典之外还有其他任何东西。
  • 您说的都对 - 感谢您的快速反馈。它只是一种不同于我以前看到的格式,并且被列表和字典的组合所抛弃。
  • 'KEY2' 关联的值将字典包装在一个列表中,这很烦人。但与某些人用 JSON 做的一些真正可怕的事情相比,这是相当温和的。 :)

标签: python json python-2.7


【解决方案1】:

foo_brackets_json['KEY2'] 引用了一个列表,这里只有一个元素。

您必须使用整数索引来引用该列表中包含的字典:

foo_brackets_json['KEY2'][0]['KEY2b']

不要试图去掉括号;这里可能有 0 个或多个嵌套字典。您必须确定在您没有只有 1 个嵌套字典的情况下应该发生什么。

上面的硬编码参考假设列表中总是至少有一个这样的字典,并且不关心是否有多个。

您可以使用 循环 来处理 0 或更多的情况:

for nested in foo_brackets_json['KEY2']:
    print(nested['KEY2b'])

现在您正在逐一处理每个嵌套字典。这适用于空列表的情况,如果有多个。

您可以将 0 或多个作为错误:

if len(foo_brackets_json['KEY2']) != 1:
    raise ValueError('Unexpected number of results')

等等。等等。这一切都取决于您的实际用例。

【讨论】:

    猜你喜欢
    • 2020-12-24
    • 2021-11-10
    • 2021-05-10
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2021-09-25
    • 2018-05-31
    • 2022-11-17
    相关资源
    最近更新 更多