python - 在 Python 中返回嵌套 JSON 对象中的值

标签 python json

首先我要说的是这个问题有两部分,第二部分在最后提到。

我想获取具有特定名称的所有关联字符串的值。让我尝试用一​​些 JSON 示例来解释。

{
  "data": {
    "list": {
      "123": {
        "location": 123,
        "x": 0.1,
        "y": 0.2,
        "ids": [
          {
            "id_a": 123
            "id_b": 442
          },
          {
            "id_a": 123
            "id_b": 443
          },
          {
            "id_a": 123
            "id_b": 444
          }
        ]
      }
      "555": {
        "location": 555,
        "x": 0.6,
        "y": 0.4,
        "ids": [
          {
            "id_a": 555
            "id_b": 449
          },
          {
            "id_a": 555
            "id_b": 450
          }
        ]
      }
    }
  }
}

我想返回所有“id_b”值的数组。这是我想要的输出:

array = [442, 443, 444, 449, 450]

我得到的最接近的是使用以下内容:

import json
import urllib.request as ur

file = ur.urlopen(url)
data = json.loads(file.read())

r = []
r = data['data']['list']['123']['ids'][0]['id_b']
print(r)

我会得到 442。删除 [0] 会给我留下“类型错误:列表索引必须是整数或切片,而不是 str”。我可以尝试包含一个循环,其中 [0] 变为 [i],i 是“ids”的数量,但这个数字对于所有位置来说并不一致。

我还没有找到任何将 Python 与这样的 JSON 结构一起使用的示例。如果有人知道任何可以提供帮助的资源,我很乐意从这些资源开始。

此外,相关网址每天都会变化,我有代码可以根据日期更改网址。但是,当日期更改时,“列表”下的对象名称也会更改,即“123”可能会变为“326”。 “位置”和“id_a”也是如此。这些都是一样的。 “123”=“位置”值=“id_a”值。

有没有一种方法可以简单地将带有字符串“id_b”的所有值放入数组中?这就是我最终想要的。

最佳答案

假设没有比示例中显示的更多嵌套,您可以使用单个列表理解:

>>> d = json.load(open("tmp.json"))
>>> [i['id_b'] for v in d['data']['list'].values()
...            for i in v['ids']]
[442, 443, 444, 449, 450]

如果顺序很重要(尽管不应该,因为 JSON 对象中的键顺序未定义),则必须依赖 Python 3.7 保证的 dict 迭代顺序.

关于python - 在 Python 中返回嵌套 JSON 对象中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55847049/

相关文章:

python - 将 Python 包上传到 PyPI

python - Argparse 需要带有可变参数的选项吗?

javascript - 访问 facebook api 获取餐厅

php - 使用 PHP 在 JSON 中创建空对象的最佳方法?

MYSQL JSON select查询每次运行返回不同的结果

python - Pandas:删除具有 nan 值索引的行

python - TCP 客户端无法连接到 TCP 服务器

javascript - 将来自 Web 服务的字符串转换为 JSON

c# - 有没有办法在事先不知道对象结构的情况下从 JSON 组合匿名类型对象?

python - 高效地生成长度为 N 的列表中长度为 K 的循环移位的所有排列