查找 json 属性的父名称 - 未知结构 - Python

Find parent name of a json attribute - unknown structure - Python

有一个结构未知的 JSON 文件。

我需要在此文件中找到已知名称的属性,如果存在,return 其父节点或节点的名称(如果该属性有多个实例)。

示例 #1:

输入文件:

{
    "attr1": {
        "attr2": {
            "attr3": "somevalue"
            "attr7": "someothervalue"
        }
    }
}

属性名称:“attr7”

预期 return 值:“attr2”

示例 #2:

输入文件:

{
    "some": {
        "deeply": {
            "nested": {
                "stuff": {
                    "array1": [
                        {"this":"value1"},
                        {"this":"value2"},
                        {"this":"value3"}
                     ]
                }
            }
        }
    }
}

属性名称:“this”

预期 return 值:“array1”

示例#3: (与#2 类似,但有重复)

输入文件:

{
    "some": {
        "deeply": {
            "nested": {
                "this": {
                    "array1": [
                        {"this":"value1"},
                        {"this":"value2"},
                        {"this":"value3"}
                     ]
                }
            }
        }
    }
}

属性名称:“this”

预期 return 值:“array1”、“嵌套”

我的出发点是:

import json

if __name__ == "__main__":
    jsonFileName = "file.json"
    attributeName = "this"
    jsonFile = open(jsonFileName, "r")
    jsonData = json.load(jsonFile)
    # ???

我找到了这个: 但它并不适用于我的情况,因为他们知道他们的数据结构而我不知道。

有什么提示吗?

因此,与更有经验的 colleague 来回交流后,我想出了以下解决方案:

def findKey(jsonData: json, keyName: str, accessPath: str):
    if isinstance(jsonData, str):
        return None
    for key in jsonData.keys():
        if key == keyName:
            return accessPath + f"/{keyName};"
        if isinstance(jsonData[key], list):
            for jd in jsonData[key]:
                fk = findKey(jd, keyName, accessPath + "/[]" + key)
                if(fk):
                    return fk
        elif isinstance(jsonData[key], dict):
            fk = findKey(jsonData[key], keyName, accessPath + "/{}" + key)
            if(fk):
                return fk
    return None