У меня есть json-файл, который при загрузке в python с использованием json.loads()
становится dictionary
. Данные json - это nested dictionary
, который может содержать ключ 'groups'
внутри другого ключа 'groups'
. Значения внутри ключа 'groups'
представляют собой ключ 'name'
и ключ 'properties'
.Обновить значение словаря с помощью python
Ключ 'properties'
имеет уникальный 'name'
и ключ 'value'
.
Моя цель состоит в том, чтобы искать 'groups'
ключа, имеющего свою 'name'
ключевое значение в качестве "SportCar"
, который имеет properties
ключ, имеющий name
ключевое значение в качестве "BMW"
, и только тогда, когда эти условия выполняются, обновить 'data'
ключ от 'data':value1
к 'data':value2
,
Пример JSON заключается в следующем
{
"groups": [
{
"name": "SportCar",
"properties": [
{
"name": "BMW",
"value": {
"type": "String",
"encoding": "utf-8",
"data": "value1"
}
},
{
"name": "Audi",
"value": {
"type": "Boolean",
"data": true
}
}
],
"groups": [
{
"name": "Trucks",
"properties": [
{
"name": "Volvo",
"value": {
"type": "String",
"encoding": "utf-8",
"data": "value1"
}
}
]
}
]
},
{
"name": "MotorCycle",
"properties": [
{
"name": "Yamaha",
"value": {
"type": "String",
"encoding": "utf-8",
"data": "value1"
}
}
],
"groups": [
{
"name": "Speeders",
"properties": [
{
"name": "prop2",
"value": {
"type": "String",
"encoding": "utf-8",
"data": "value1"
}
}
]
}
]
}
]
}
выше JSON содержится в myjson22.json. Вот то, что я пытался до сих пор:
import json
from pprint import pprint
json_data=open('myjson22.json', 'r')
data = json.load(json_data)
#print(data)
def get_recursively(search_dict, field):
"""
To read the json data as type dict and search all 'groups' keys for the 'name' key value value provided.
"""
fields_found = []
for key, value in search_dict.items():
if key == field:
fields_found.append(value)
elif isinstance(value, dict):
results = get_recursively(value, field)
for result in results:
fields_found.append(result)
elif isinstance(value, list):
for item in value:
if isinstance(item, dict):
more_results = get_recursively(item, field)
for another_result in more_results:
fields_found.append(another_result)
return fields_found
get_recursively(data, ["properties"][0])
и выход был:
[[{'name': 'BMW',
'value': {'data': 'value1', 'encoding': 'utf-8', 'type': 'String'}},
{'name': 'Audi', 'value': {'data': True, 'type': 'Boolean'}}],
[{'name': 'Volvo',
'value': {'data': 'value1', 'encoding': 'utf-8', 'type': 'String'}}],
[{'name': 'Yamaha',
'value': {'data': 'value1', 'encoding': 'utf-8', 'type': 'String'}}],
[{'name': 'prop2',
'value': {'data': 'value1', 'encoding': 'utf-8', 'type': 'String'}}]]
Что вы пробовали до сих пор и почему он не в состоянии для достижения желаемых результатов? –
'ONE property ', но свойства - это массив? – njzk2
Пожалуйста, поделитесь с нами кодом и ошибкой. –