【问题标题】:Parsing JSON nested Dictionary using Python使用 Python 解析 JSON 嵌套字典
【发布时间】:2019-01-18 04:33:33
【问题描述】:

我在 JSON 中有以下嵌套字典。如果我想得到“id”、“self”、“name”,我应该如何使用 Python 程序来解析它。

{
  "items": [
    {
      "id": "12345",
      "links": {
        "self": "https://www.google.com"
      },
      "name": "beast",
      "type": "Device"
    }
  ],
  "links": {
    "self": "https://www.google.com"
  },
  "paging": {
    "count": 1,
    "limit": 1,
    "offset": 0,
    "pages": 1
  }
}

【问题讨论】:

  • 哪个自己?两个?
  • @Onyambu 是的。对他们俩来说。
  • 不完全相同的问题,但应该指出你正确的方向Parsing values from a JSON file

标签: python json python-3.x dictionary data-structures


【解决方案1】:

要了解您的 json 是如何设置的,分解它更容易。让我们看看第一个字典的键,然后删除值。

json = {"items": [], "links": {}}

您有一个包含两个键和两个值的字典。您要查找的所有三个变量(id、self、name)都在第一个键“items”中。因此,让我们更深入地研究。

json["items"] = [{'links': {'self': 'https://www.google.com'}, 'name': 'beast', 'type': 'Device', 'id': '12345'}]

现在您有了一个包含您要查找的值的字典的列表,所以让我们输入包含下一个字典的列表的第一个也是唯一的值。

json["items"][0] = {'links': {'self': 'https://www.google.com'}, 'id': '12345', 'type': 'Device', 'name': 'beast'}

最后我们有了要查找的值的字典,因此您可以使用此代码查找名称和 ID。

json["items"][0]["name"] = beast

json["items"][0]["id"] = 12345

self 变量隐藏在更深的一本字典中,因此我们必须深入研究 links 键。

json["items"][0]["links"]["self"] = http://google.com

现在你有了所有的值,你只需要遍历所有的列表和字典来得到你想要的值。

【讨论】:

  • 非常感谢!
  • 没问题,很高兴能帮上忙
  • 非常感谢,这个例子是关于 1 个项目和一个链接键。如果有多个项目和链接,我该如何应用它来获取所有项目和链接?
  • 这太有用了!谢谢!
  • 非常非常有帮助 - 这实际上是有道理的!
【解决方案2】:

你可以写一个函数,它会得到你需要的值:

def dict_get(x,key,here=None):
    x = x.copy()
    if here is None: here = []
    if x.get(key):  
        here.append(x.get(key))
        x.pop(key)
    else:
        for i,j in x.items():
          if  isinstance(x[i],list): dict_get(x[i][0],key,here)
          if  isinstance(x[i],dict): dict_get(x[i],key,here)
    return here

dict_get(a,'id')
 ['12345']

dict_get(a,'self')
 ['https://www.google.com', 'https://www.google.com']

dict_get(a,'name')
['beast']

你也可以调用任何你想要的键:

数据

a = {
  "items": [
    {
      "id": "12345",
      "links": {
        "self": "https://www.google.com"
      },
      "name": "beast",
      "type": "Device"
    }
  ],
  "links": {
    "self": "https://www.google.com"
  },
  "paging": {
    "count": 1,
    "limit": 1,
    "offset": 0,
    "pages": 1
  }
}

【讨论】:

  • dict_get(a,id) 中的“a”是什么?
  • 当我调用该函数时,我没有得到任何输出。你是怎么得到 [''12345"] 的?
  • @IamL 再次运行该函数,我得到的正是我发布的内容。可以再复制粘贴一下代码吗?
【解决方案3】:

您的 json 基本上包含其中的列表。 Json 作为键值对访问,列表使用索引访问。

json_object['items'][0]['id']

上面的语句应该给你 id。我们正在访问包含列表的关键项目。我们有 [0] 因为这个列表只包含一个元素(这又是一个键值对)。

self 和 name 遵循相同的方法

json_object['links']['self']
json_object['items'][0]['links']['self']
json_object['items'][0]['name']

访问两个不同的'self'之间的区别在于一个包含在一个列表中,因此我们需要进入列表,另一个是一个带有键'self'的字典,它位于字典'links'中

【讨论】:

    【解决方案4】:

    它有助于编写缩进的字典,以便更好地查看它的嵌套:

    mydict = {   
       'items': [
           {
               'id': '12345',
               'links': {'self': 'https://www.google.com'},
               'name': 'beast',
               'type': 'Device'
           }
        ],
        'links': {'self': 'https://www.google.com'},
        'paging': {
            'count': 1,
            'limit': 1,
            'offset': 0,
            'pages': 1
        }
    }
    

    现在你可以提取你想要的:

    如果我想得到“id”、“self”、“name”,

    print(mydict['items'][0]['id'])
    print(mydict['items'][0]['links']['self'])
    print(mydict['links']['self'])
    print(mydict['items'][0]['name'])
    

    【讨论】:

      猜你喜欢
      • 2018-09-05
      • 1970-01-01
      • 2021-09-25
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 2018-05-29
      • 1970-01-01
      相关资源
      最近更新 更多