如何将嵌套的 json 键收集到线性列表

How to collect nested json keys to a linear list

我正在处理大型嵌套 json 并且需要收集所有 Json 键来列出, 即:

对于 json:

{"taxIncludedAmount":{},"impactingPriceParameter":[{}],"extensions":{"additionalProp1":{}}}}

我想收集列表的密钥, 并添加括号,以便我知道密钥的类型。 所以对于以上 json 我想得到(包括正确的顺序):

eventType
event{}.dataStrategy
event{}.error{}.code
event{}.error{}.characteristics[].name

我设法使用找到的一些代码示例获取所有密钥, 但找不到为 dic 添加括号 {} 和为列表添加括号 [] 的方法。

代码:

         
def get_keys(d, curr_key=[]):
    for k, v in d.items():
        if isinstance(v, dict):
            yield from get_keys(v, curr_key + [k])
        elif isinstance(v, list):
            for i in v:
                yield from get_keys(i, curr_key + [k])
        else:
            yield '.'.join(curr_key + [k])
    

   
    
def main():
  array_json_keys = [*get_keys(json_data)]


输出:


event.dataStrategy
event.error.characteristics.name
event.error.code
eventType

这是“差不多了,我需要添加方括号({} 表示 dic,[] 表示数组) 此外,我想对其进行排序,以便首先显示第一级对象。

更新:

感谢@blhsing - 它解决了括号, 由于某种原因,它在示例

中跳过了空键
 "impactingPriceParameter": [
    {}
  ]

or 
  "extensions": {
    "additionalProp1": {}
  }

您可以简单地将 '{}''[]' 连接到键 k,具体取决于值的数据类型 v:

def get_keys(d, curr_key=[]):
    for k, v in d.items():
        if isinstance(v, dict):
            yield from get_keys(v, curr_key + [k + '{}'])
        elif isinstance(v, list):
            for i in v:
                yield from get_keys(i, curr_key + [k + '[]'])
        else:
            yield '.'.join(curr_key + [k])