【问题标题】:How to collect nested json keys to a linear list如何将嵌套的 json 键收集到线性列表
【发布时间】:2020-12-16 10:17:34
【问题描述】:

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

【问题讨论】:

    标签: python json nested key


    【解决方案1】:

    您可以简单地将'{}''[]' 连接到键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])
    

    【讨论】:

    • 非常感谢,非常感谢:) 对于排序部分,有没有办法对输出进行排序,以便首先显示最高级别的键?
    • 不客气。要首先产生最高级别的键,您应该使用广度优先搜索(使用基于队列的实现)而不是深度优先搜索(使用递归)。如果遇到困难,请先尝试一下,然后提出一个新问题。
    • 如果您想要一种简单(但效率较低)的方式在 DFS 之后对列表进行排序,您可以简单地按每个字符串中的点数对列表进行排序。
    • 使用bfs意味着我首先需要对dict键进行排序,然后调用get_keys函数?
    猜你喜欢
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多