如何使用 pymongo 获取 Json 文档的所有键?

How to get all the keys of a Json document using pymongo?

我有一份以下格式的文件,

   {
"glossary": {
    "title": "example glossary",
    "GlossDiv": {
        "title": "S",
        "GlossList": {
            "GlossEntry": {
                "ID": "SGML",
                "SortAs": "SGML",
                "GlossTerm": "Standard Generalized Markup Language",
                "Acronym": "SGML",
                "Abbrev": "ISO 8879:1986",
                "GlossDef": {
                    "para": "A meta-markup language, used to create markup languages such as DocBook.",
                    "GlossSeeAlso": ["GML", "XML"]
                },
                "GlossSee": "markup"
            }
        }
    }
}
}

我需要获取所有键,包括嵌套键。但是我只能得到第一级的钥匙,例如:glossary.

谁能告诉我,有什么办法可以找回所有的密钥吗?

您可以使用递归函数挖掘每一层并打印密钥。

def recurse_keys(document):
    for key in document.keys():
        print(str(key))
        if isinstance(document[key], dict):
           recurse_keys(document[key])

更新: 对于嵌套格式

def recurse_keys(document,parent):
    for key in document.keys():
        if parent!="":
            print(parent+'.'+str(key))
        else:
            print str(key)
        if isinstance(document[key], dict):
            if parent!="":
                recurse_keys(document[key],parent+'.'+str(key))
            else:
                recurse_keys(document[key],str(key))
from re import findall
input_dict = {
"glossary": {
    "title": "example glossary",
    "GlossDiv": {
        "title": "S",
        "GlossList": {
            "GlossEntry": {
                "ID": "SGML",
                "SortAs": "SGML",
                "GlossTerm": "Standard Generalized Markup Language",
                "Acronym": "SGML",
                "Abbrev": "ISO 8879:1986",
                "GlossDef": {
                    "para": "A meta-markup language, used to create markup languages such as DocBook.",
                    "GlossSeeAlso": ["GML", "XML"]
                },
                "GlossSee": "markup"
            }
        }
    }
}
}
dict1=str(input_dict)
pattern = r"'([A-Za-z0-9_\./\-]*)':"
m = findall(pattern, dict1)
print m

米是:- ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'GlossDef', 'GlossSeeAlso', 'para', 'GlossSee', 'Acronym', 'GlossTerm', 'Abbrev', 'SortAs', 'ID', 'title', 'title']

让我告诉你这个如果你只是想拥有所有键就可以正常工作,但如果你希望它们采用嵌套形式,那么最好进行递归方式。完成后将提供递归代码。

如果我当前的解决方案可以进行一些改进,请提出建议。