如何在Python中从JSON获取嵌套字典

时间:2019-01-22 22:47:26

标签: python json dictionary

我想使用一些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来获取它(仅外部组,索引以及键(例如“ name”))。由于我已经返回了{'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变量已经是字典格式的,这是索引的一种特殊情况。

4 个答案:

答案 0 :(得分:0)

如果要访问该特定元素,则可以执行以下操作:

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}

答案 1 :(得分:0)

如果您的字符串中包含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'

答案 2 :(得分:0)

感谢@Primusa的评论。

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

答案 3 :(得分:0)

通常,如果您知道内部字典中只有一个键-值对,而您只想要它的值,则可以枚举值,然后访问第一个值,如下所示:

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