Как найти и заменить данные в JSON?
Получаю по api JSON такого вида:
[{
"comments": 18,
"idMembers": [
"61f11c9f67ffdd60eca0e258",
"621db63b462c867ee790e4f7",
"6193c309a86ee2327a054b0d"
],
"labels": [
"метка 1",
"метка 2"
],
"name": "task 1",
"start": "2022-07-28T01:00:00.000Z"
},
{
"comments": 0,
"idMembers": [
"6193c309a86ee2327a054b0d"
],
"labels": [
"метка 2",
"метка 3"
],
"name": "task 2",
"start": "2022-08-05T01:00:00.000Z"
}]
Есть вот такой словарь с данным по каждому idMembers:
userArray = {'621db63b462c867ee790e4f7': 'Иван',
'61f11c9f67ffdd60eca0e258': 'Владимир',
'59a7dbc4557c9b17edbc02fa': 'Руслан',
'6193c309a86ee2327a054b0d': 'Максим',
'61fcc437b431385175d8fbee': 'Александра'}
Нужно найти в json совпадения по idMembers и ключу userArray и заменить ключ (621db63b462c867ee790e4f7) на значение(Иван).
Т.е. нужно преобразовать json в словарь, получить по ключу idMembers список, обойти его, на каждой итерации проверять вхождение элемента в userArray, сгенерировать новый список из найденных элементов, записать его обратно в словарь.
json преобразовываю в словарь сразу при получении:
jsonData = jmespath.search(query, json.loads(response.text)) //jmespath запрос к json для фильтра данных
Далее не знаю как делать, по идее нужен цикл, типа:
for entry in jsonData:
if entry['idMembers'] is userArray:
...
Помогите пожалуйста.
Ответы (1 шт):
Тут хорошо подойдёт списковое сокращение и метод словаря get, потому что нужно перебрать все id из списка и заменить те, которые есть в словаре, на значения из словаря:
for item in jsonData:
item['idMembers'] = [userArray.get(member, member) for member in item['idMembers']]
Результат:
[{'comments': 18,
'idMembers': ['Владимир', 'Иван', 'Максим'],
'labels': ['метка 1', 'метка 2'],
'name': 'task 1',
'start': '2022-07-28T01:00:00.000Z'},
{'comments': 0,
'idMembers': ['Максим'],
'labels': ['метка 2', 'метка 3'],
'name': 'task 2',
'start': '2022-08-05T01:00:00.000Z'}]