我想使用一些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
变量已经是字典格式的,这是索引的一种特殊情况。
答案 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', ... }