查找 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
有一个结构未知的 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