我有以下列表(注意“keyE”有一个字典作为字符串):
[
{
"keyA": "Example",
"keyB": "{\"keyC\":2,\"keyD\":{\"keyE\":\"{\"name\":\"foo\"}\"},\"keyF\":0}"
},
{
"keyA": "Example2",
"keyB": "{\"keyC\":6,\"keyD\":{\"keyE\":\"{\"name\":\"bar\"}\"},\"keyF\":5}"
}
]
我想将其转换为这个(它可以有任意数量的嵌套字典和列表):
[
{
"keyA": "Example",
"keyB": {
"keyC": 2,
"keyD": {
"keyE": {
"name": "foo"
}
},
"keyF": 0
}
},
{
"keyA": "Example2",
"keyB": {
"keyC": 6,
"keyD": {
"keyE": {
"name": "bar"
}
},
"keyF": 5
}
}
]
到目前为止,我有以下内容,但我不知道在 json.loads
之后要做什么。我知道我必须递归调用该函数,但不知道如何调用。
import json
def convert(data_list: list) -> list:
for i in range(len(data_list)):
obj = data_list[i]
for key, value in obj.items():
if isinstance(value, str) and any(char in "{[]}" for char in value):
try:
data = json.loads(value)
# What do I do here?
except:
continue
最佳答案
不知道这是否适用于您更复杂的情况,但我能够使用 ast.literal_eval()
和一些非常糟糕的链接 str.replace
调用:
import ast
def replace(s):
return ast.literal_eval(s.replace(r'"{', "{").replace(r'}"', "}"))
x = [{"keyA": "Example",
"keyB": "{\"keyC\":2,\"keyD\":{\"keyE\":\"{\"name\":\"foo\"}\"},\"keyF\":0}"},
{"keyA": "Example2",
"keyB": "{\"keyC\":6,\"keyD\":{\"keyE\":\"{\"name\":\"bar\"}\"},\"keyF\":5}"}]
for d in x:
for key, value in d.items():
if "{" in value:
d[key] = replace(value)
输出:
In [4]: x
Out[4]:
[{'keyA': 'Example',
'keyB': {'keyC': 2, 'keyD': {'keyE': {'name': 'foo'}}, 'keyF': 0}},
{'keyA': 'Example2',
'keyB': {'keyC': 6, 'keyD': {'keyE': {'name': 'bar'}}, 'keyF': 5}}]
In [5]: x[0]["keyB"]["keyD"]["keyE"]["name"]
Out[5]: 'foo'
关于Python将包含嵌套json的字符串转换为dict,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71059822/