如何格式化 json 转储
how to format json dumps
我得到了 json 个像这样的转储:
"aaa": {
"bbb": {
"ccc": {
"ddd": "string1",
"eee": "string2"
}
},
"kkk": "string3"
}
我想这样格式化:将每个键值对(由 :
分隔)用 {}
括起来,然后用 [=16= 替换 :
].
我知道我可以使用 re.sub()
来替换字符串模式,但是正则表达式不适用于重叠模式,所以我可以匹配 "ddd": "string1"
但不能匹配 "ccc": {...}
同时.
对于上面的json字符串,我想得到:
{"aaa", {
{"bbb", {
{"ccc", {
{"ddd", "string1"},
{"eee", "string2"}
}}
}},
{"kkk", "string3"}
}}
这是一个技巧,可以将所有内容转换为列表,然后将方括号更改为大括号。如果您的字符串可能包含方括号,那将是一个问题。
import json
inp = """
{
"aaa": {
"bbb": {
"ccc": {
"ddd": "string1",
"eee": "string2"
}
},
"kkk": "string3"
}
}
"""
inp = json.loads(inp)
def items(d):
if isinstance(d, dict):
return [(k, items(v)) for k, v in d.items()]
return d
inp = items(inp)
print(json.dumps(inp, indent=2).replace("[", "{").replace("]", "}"))
输出:
{
{
"aaa",
{
{
"bbb",
{
{
"ccc",
{
{
"ddd",
"string1"
},
{
"eee",
"string2"
}
}
}
}
},
{
"kkk",
"string3"
}
}
}
}
请注意,当字典键未排序时,您将其视为有序的,因此我使用列表使其更加明确。
如果是我,我不会首先转储到 JSON,我会将原生 python 数据结构直接序列化为 C++ 初始化列表语法:
myobj = {
"aaa": [
{ "bbb": {
"ccc": [
{"ddd": "string1"},
{"eee": "string2"}
]
}},
{ "kkk": "string3" }
]
}
def pyToCpp(value, key=None):
if key:
return '{{ "{}", {} }}'.format(key, pyToCpp(value))
if type(value) == dict:
for k, v in value.items():
return pyToCpp(v, k)
elif type(value) == list:
l = [pyToCpp(v) for v in value]
return '{{ {} }}'.format(", ".join(l))
else:
return '"{}"'.format(value)
y = pyToCpp(myobj)
print(y)
输出:
{ "aaa", { { "bbb", { "ccc", { { "ddd", "string1" }, { "eee", "string2" } } } }, { "kkk", "string3" } } }
我得到了 json 个像这样的转储:
"aaa": {
"bbb": {
"ccc": {
"ddd": "string1",
"eee": "string2"
}
},
"kkk": "string3"
}
我想这样格式化:将每个键值对(由 :
分隔)用 {}
括起来,然后用 [=16= 替换 :
].
我知道我可以使用 re.sub()
来替换字符串模式,但是正则表达式不适用于重叠模式,所以我可以匹配 "ddd": "string1"
但不能匹配 "ccc": {...}
同时.
对于上面的json字符串,我想得到:
{"aaa", {
{"bbb", {
{"ccc", {
{"ddd", "string1"},
{"eee", "string2"}
}}
}},
{"kkk", "string3"}
}}
这是一个技巧,可以将所有内容转换为列表,然后将方括号更改为大括号。如果您的字符串可能包含方括号,那将是一个问题。
import json
inp = """
{
"aaa": {
"bbb": {
"ccc": {
"ddd": "string1",
"eee": "string2"
}
},
"kkk": "string3"
}
}
"""
inp = json.loads(inp)
def items(d):
if isinstance(d, dict):
return [(k, items(v)) for k, v in d.items()]
return d
inp = items(inp)
print(json.dumps(inp, indent=2).replace("[", "{").replace("]", "}"))
输出:
{
{
"aaa",
{
{
"bbb",
{
{
"ccc",
{
{
"ddd",
"string1"
},
{
"eee",
"string2"
}
}
}
}
},
{
"kkk",
"string3"
}
}
}
}
请注意,当字典键未排序时,您将其视为有序的,因此我使用列表使其更加明确。
如果是我,我不会首先转储到 JSON,我会将原生 python 数据结构直接序列化为 C++ 初始化列表语法:
myobj = {
"aaa": [
{ "bbb": {
"ccc": [
{"ddd": "string1"},
{"eee": "string2"}
]
}},
{ "kkk": "string3" }
]
}
def pyToCpp(value, key=None):
if key:
return '{{ "{}", {} }}'.format(key, pyToCpp(value))
if type(value) == dict:
for k, v in value.items():
return pyToCpp(v, k)
elif type(value) == list:
l = [pyToCpp(v) for v in value]
return '{{ {} }}'.format(", ".join(l))
else:
return '"{}"'.format(value)
y = pyToCpp(myobj)
print(y)
输出:
{ "aaa", { { "bbb", { "ccc", { { "ddd", "string1" }, { "eee", "string2" } } } }, { "kkk", "string3" } } }