首页 > 解决方案 > 如何将嵌套的 json 键收集到线性列表

问题描述

我正在使用大型嵌套 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": {}
  }

标签: pythonjsonnestedkey

解决方案


您可以根据 value 的数据类型简单地连接'{}'或连接'[]'到键:kv

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])

推荐阅读