簡體   English   中英

在Python中的嵌套JSON對象中返回值

[英]Returning values in nested JSON objects in Python

首先,我要說這個問題有兩個部分,第二部分最后提到。

我想獲取具有特定名稱的所有關聯字符串的值。 讓我嘗試用一​​些示例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]會留下“ TypeError:列表索引必須是整數或切片,而不是str”。 我可以嘗試並包含一個循環,其中[0]變為[i],而i是'ids'的數量,但此數字並非在所有位置都一致。

我還沒有找到像這樣的JSON結構使用Python的任何示例。 如果有人知道有什么資源可以幫助我,我會很高興地從這些資源開始。

另外,有問題的網址每天都會更改,我有相應的代碼可以根據日期更改網址。 但是,當更改日期時,“列表”下的對象名稱也會更改,即“ 123”可能變為“ 326”。 同樣與“位置”和“ id_a”。 這些都是一樣的。 “ 123” =“位置”值=“ id_a”值。

有沒有一種方法可以將所有帶有字符串“ id_b”的值簡單地放入數組中? 最終這就是我想要的。

您可以嘗試遞歸方法:

def find_by_key(obj, key):
    if isinstance(obj, dict):
        for k, v in obj.items():
            if k == key:
                yield v

            else:
                yield from find_by_key(v, key)

    elif isinstance(obj, list):
        for sub in obj:
            yield from find_by_key(sub, key)

    else:
        return

print(list(find_by_key(data, 'id_b')))

輸出:

[442, 443, 444, 449, 450]

您需要遞歸函數

遞歸函數:

遞歸是對問題進行編程或編碼的一種方法,其中函數在自身體內對其進行一次或多次調用。 通常,它返回此函數調用的返回值。

終止條件:遞歸函數必須終止才能在程序中使用。 如果每次進行遞歸調用時問題的解決方案減小了尺寸,並朝着基本情況發展,則遞歸函數終止。 基本情況是無需進一步遞歸即可解決問題的情況。

def id_generator(dict_var, key):
    for k, v in dict_var.items():
        if isinstance(v, dict):
            for id_val in id_generator(v,key):
                yield id_val
        elif isinstance(v, list):
            for item in v:
                yield item[key]

key = 'id_b'
print(list(id_generator(data, key)))

輸出:

[442, 443, 444, 449, 450]

假設沒有比示例中顯示的嵌套更多的嵌套,則可以使用單個列表推導:

>>> 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保證的dicts迭代順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM