簡體   English   中英

如何在Python中從JSON獲取嵌套字典

[英]How to get nested dictionary from JSON in Python

我想要一些JSON,將其轉換為字典,然后更改該字典中的某些值。

我嘗試了如下所示的一些操作,但無法按預期工作。

我的JSON如下:

{
   "9":[
      {
         "09_000":{
            "name":"Wyatt Feldt",
            "1":"R",
            "2":"L",
            "w":1,
            "h_t":1
         }
      },
      {
         "09_001":{
            "name":"Clayton Friend",
            "1":"R",
            "2":"R",
            "w":0,
            "h_t":0
         }
      }
   ],
   "10":[
      {
         "09_000":{
            "name":"Wyatt Feldt",
            "1":"R",
            "2":"L",
            "w":1,
            "h_t":1
         }
      },
      {
         "09_001":{
            "name":"Clayton Friend",
            "1":"R",
            "2":"R",
            "w":0,
            "h_t":0
         }
      }
   ],
   "11":[
      {
         "09_000":{
            "name":"Wyatt Feldt",
            "1":"R",
            "2":"L",
            "w":1,
            "h_t":1
         }
      },
      {
         "09_001":{
            "name":"Clayton Friend",
            "1":"R",
            "2":"R",
            "w":0,
            "h_t":0
         }
      }
   ]
}

然后在Python中我編寫了print(my_data["9"][0]) ,該函數返回{'09_000':{'name':'Wyatt Feldt','1':'R','2':'L ','w':1,'h_t':1}}。

但是,我只希望它返回{'name':'Wyatt Feldt','1':'R','2':'L','w':1,'h_t':1},因為我不這樣做。如果只想打印它,我想設置一些值,例如名稱。 而且我知道我可以通過執行my_data["9"][0]["09_000"]來做到這一點,但我不想使用該ID來獲取它(僅外部組,索引然后是鍵例如“名稱”)。 由於我已經返回了{'09_000':{'name':'Wyatt Feldt','1':'R','2':'L','w':1,'h_t':1}}我確定必須有一種方法來獲取嵌套部分({'name':'Wyatt Feldt','1':'R','2':'L','w':1,'h_t ':1}),因此我可以更改值。

編輯:我認為這是一個不同的問題。 我的my_data變量已經采用字典格式,這是索引的一種特殊情況。

如果要訪問該特定元素,則可以執行以下操作:

n_entry = 0
entry_key_name = f'09_{n_entry:03}'  # If using >= python 3.6
# entry_key_name = '09_{:03}'.format(n_entry)  # If using < python 3.6
print(register["9"][n_entry][entry_key_name])

結果:

{'name': 'Wyatt Feldt', '1': 'R', '2': 'L', 'w': 1, 'h_t': 1}

如果字符串中包含JSON文本,則說它的名稱為my_json ,則可以使用Python的json.loads將其轉換為字典。

import json
register = json.loads(my_json)

在字典的旁邊,您有鍵“ 9”,“ 10”,“ 11”。 對於其中的每一個,您都有一個可以迭代的兩個項目的列表。 列表中的每個項目都是一鍵字典。 您只需要遍歷這些最后的鍵,而不必知道它們是什么:

for k in register:
    for block in register[k]:
        for block_key in block:
            print(block[block_key])

我從中得到的輸出是:

{u'1': u'R', u'h_t': 1, u'2': u'L', u'name': u'Wyatt Feldt', u'w': 1}
{u'1': u'R', u'h_t': 0, u'2': u'R', u'name': u'Clayton Friend', u'w': 0}
{u'1': u'R', u'h_t': 1, u'2': u'L', u'name': u'Wyatt Feldt', u'w': 1}
{u'1': u'R', u'h_t': 0, u'2': u'R', u'name': u'Clayton Friend', u'w': 0}
{u'1': u'R', u'h_t': 1, u'2': u'L', u'name': u'Wyatt Feldt', u'w': 1}
{u'1': u'R', u'h_t': 0, u'2': u'R', u'name': u'Clayton Friend', u'w': 0}

如果您知道列表始終將包含一個鍵的項,那么另一種方法是使用block.keys()生成字典鍵的列表,然后獲取列表中的第一個(也是唯一的)項:

for k in register:
    for block in register[k]:
        print(block[block.keys()[0]])

無論如何,您都可以用一些命令替換我已使用的print語句,以更改所需的內容。 盡管為了更容易到達正確的位置,請嘗試使用列表的索引號:

for k in register:
    for i in range(len(register[k])):
        for key in register[k][i]:
            original_name = register[k][i][key][u'name']
            if original_name == u'Wyatt Feldt':
                register[k][i][key][u'name'] = 'Wyatt Erp'

感謝@Primusa的評論。

我已經完成了print(list(my_data["9"][0].values())[0]) ,它可以按預期工作。

通常,如果您知道內部字典中只有一個鍵/值對,而您只想要它的值,則可以枚舉值,然后訪問第一個,如下所示:

wyatt = list(my_data["9"][0].values())[0] # {'name': 'Wyatt Feldt', ... }

暫無
暫無

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

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