将具有不同层数的多个嵌套字典写入具有特定格式的 JSON 文件
Write multiple nested dictionary with different number of layers to a JSON file with specific format
我有一个包含不同层数的多个词典的列表。这是它的样子:
data_ls = [
{"a": {"b": {"c1": {"d1": "d1_value"}}}},
{"a": {"b": {"c2": {"d2": {"e1": "e1_value "}}}}},
...
...
]
我需要将其写入 JSON 文件,这是我尝试过的:
json_str = json.dumps(data_ls)
json_file = open("data.json", "w")
json_file.write(json_str)
输出如下:
[
{
"a": {
"b": {
"c1": {
"d1": "d1_value"
}
}
}
},
{
"a": {
"b": {
"c2": {
"d2": {
"e1": "e1_value "
}
}
}
}
}
]
但一些相同的键被证明是分开嵌套的,所需的输出如下所示:
[{
"a": {
"b": {
"c1": {"d1": "d1_value"},
"c2": {
"d2": {"e1": "e1_value "},
},
}
}
}]
如何获得这样的输出?
提前致谢!
你可以同时使用两个字典的递归函数,检查键是否存在,如果不更新键
import json
data = [
{},
{'a': {'b': {'c1': {'d1': 'd1_value'}}}},
{'a': {'b': {'c2': {'d2': {'e1': 'e1_value '}}}}},
{'a': {'b1': {'c3': 'd3'}}},
{'x': {'y': 'z'}},
{'a': {'b': {'c2': {'d2': {'e2': 'e2_value '}}}}}
]
def fun(d1: dict, d2: dict):
for k, v in d2.items():
if k not in d1:
d1[k] = v
if isinstance(v, dict):
return fun(d1[k], v)
res = data[0]
for d in data[1:]:
fun(res, d)
print(json.dumps(res))
输出:
{
"a": {
"b": {
"c1": {
"d1": "d1_value"
},
"c2": {
"d2": {
"e1": "e1_value ",
"e2": "e2_value "
}
}
},
"b1": {
"c3": "d3"
}
},
"x": {
"y": "z"
}
}
注:
I'm only considering nested elements as dicts and other non sequence types
我有一个包含不同层数的多个词典的列表。这是它的样子:
data_ls = [
{"a": {"b": {"c1": {"d1": "d1_value"}}}},
{"a": {"b": {"c2": {"d2": {"e1": "e1_value "}}}}},
...
...
]
我需要将其写入 JSON 文件,这是我尝试过的:
json_str = json.dumps(data_ls)
json_file = open("data.json", "w")
json_file.write(json_str)
输出如下:
[
{
"a": {
"b": {
"c1": {
"d1": "d1_value"
}
}
}
},
{
"a": {
"b": {
"c2": {
"d2": {
"e1": "e1_value "
}
}
}
}
}
]
但一些相同的键被证明是分开嵌套的,所需的输出如下所示:
[{
"a": {
"b": {
"c1": {"d1": "d1_value"},
"c2": {
"d2": {"e1": "e1_value "},
},
}
}
}]
如何获得这样的输出? 提前致谢!
你可以同时使用两个字典的递归函数,检查键是否存在,如果不更新键
import json
data = [
{},
{'a': {'b': {'c1': {'d1': 'd1_value'}}}},
{'a': {'b': {'c2': {'d2': {'e1': 'e1_value '}}}}},
{'a': {'b1': {'c3': 'd3'}}},
{'x': {'y': 'z'}},
{'a': {'b': {'c2': {'d2': {'e2': 'e2_value '}}}}}
]
def fun(d1: dict, d2: dict):
for k, v in d2.items():
if k not in d1:
d1[k] = v
if isinstance(v, dict):
return fun(d1[k], v)
res = data[0]
for d in data[1:]:
fun(res, d)
print(json.dumps(res))
输出:
{
"a": {
"b": {
"c1": {
"d1": "d1_value"
},
"c2": {
"d2": {
"e1": "e1_value ",
"e2": "e2_value "
}
}
},
"b1": {
"c3": "d3"
}
},
"x": {
"y": "z"
}
}
注:
I'm only considering nested elements as dicts and other non sequence types