вставить словарь в список вложенных объектов - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть следующие данные JSON:

[{"status_code": 200, "data": {"key": 1, "key": "value", "key": "value", "key": "value", "key": [{"key": "value", "key": "value"}, {"key": "value", "key": "value"}, {"key": "value", "key": "value"}, {"key": "value", "key": "value"}, {"key": "value", "key": "value"}]}, "status_txt": "OK"},{"status_code": 200, "data": {"key": 1, "key": "value", "key": "value", "key": "value", "key": []}, "status_txt": "OK"}]

Мне нужно добавить список словарей: {"key":"a"},{"key":"b"}

так, чтобы каждый ключ добавлялся в каждый объект, так что результатможет быть так:

[{"status_code": 200, "data": {"key": 1, "key": "value", "key": "value", "key": "value", "key": [{"key": "value", "key": "value"}, {"key": "value", "key": "value"}, {"key": "value", "key": "value"}, {"key": "value", "key": "value"}, {"key": "value", "key": "value"}]}, "status_txt": "OK", "key":"a"},{"status_code": 200, "data": {"key": 1, "key": "value", "key": "value", "key": "value", "key": []}, "status_txt": "OK", "key":"b"}]

Один из ответов, которые я пробовал, был этот код, но он не работает:

data = json.load(open('file.json'))
if type(data) is dict:
   data = [data]

data.append({"key": "a","key": "b"})
with open('file.json', 'w') as outfile:
    json.dump(data, outfile)

Ошибка: JSONDecodeError: Extra data: line 1 column 449 (char 448)

Isэто возможно?
Спасибо!

1 Ответ

0 голосов
/ 09 февраля 2019

Вам необходимо понять разницу между dict и list .

Насколько я понимаю, ваша проблема с предоставленными вами входными данными, вашими данными и выходными данными, вы можете сделать:

inp = [{"status_code": 200, "data": {"key": 1, "key": "value", "key": "value", "key": "value", "key": [{"key": "value", "key": "value"}, {"key": "value", "key": "value"}, {"key": "value", "key": "value"}, {"key": "value", "key": "value"}, {"key": "value", "key": "value"}]}, "status_txt": "OK"},{"status_code": 200, "data": {"key": 1, "key": "value", "key": "value", "key": "value", "key": []}, "status_txt": "OK"}]
data = [{"key":"a"},{"key":"b"}]
out = [{"status_code": 200, "data": {"key": 1, "key": "value", "key": "value", "key": "value", "key": [{"key": "value", "key": "value"}, {"key": "value", "key": "value"}, {"key": "value", "key": "value"}, {"key": "value", "key": "value"}, {"key": "value", "key": "value"}]}, "status_txt": "OK", "key":"a"},{"status_code": 200, "data": {"key": 1, "key": "value", "key": "value", "key": "value", "key": []}, "status_txt": "OK", "key":"b"}]

for item, data_item in zip(inp, data):
    item.update(data_item)

print( inp == out )
# True

То, что вы делаете в этом коде: так как ваши данные представляют собой список той же длины, что и введенные вами данные, и вы хотите добавить первый элемент ваших данных впервый элемент ввода ...

  • Вы хотите выполнять итерацию ваших данных одновременно с вводом.zip() позаботится об этом, в основном сделав кортеж каждого элемента в вашем списке.zip([1, 2], [3, 4]) становится [(1, 3), (2, 4)].

  • Затем на каждой итерации обновляет ваш словарный ввод со словарными данными.

Как видите, он дает True, если я сравниваю его с выводом, который вы сказали, что вы хотели.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...