在嵌套对象列表中插入字典

时间:2019-02-09 12:54:44

标签: python-3.x pandas dataframe dictionary

我有以下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)

这可能吗?
谢谢!

1 个答案:

答案 0 :(得分:2)

您需要了解 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。 :)