如何格式化 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" } } }

运行 在这里:https://repl.it/repls/OddFrontUsers