Python 在JSON中搜索变量,然后返回父标记的名称
因此,我试图获取一个标记的名称,该标记包含我的搜索变量,该变量是在我的循环中早些时候定义的。父标记总是不同的。 下面是我正在使用的json的结构Python 在JSON中搜索变量,然后返回父标记的名称,python,json,parsing,Python,Json,Parsing,因此,我试图获取一个标记的名称,该标记包含我的搜索变量,该变量是在我的循环中早些时候定义的。父标记总是不同的。 下面是我正在使用的json的结构 { “数据”:{ “地点”:{ “我不想要随机ID”:{ “服务”:{ “我要随机ID”:“姓名” }, “title:”(我正在搜索的字符串) } 等等等等等等 所以我试着缩小我的结果 firebase = urlopen('firebase.json').read().decode('utf-8') aniIndex = json.loads(f
{
“数据”:{
“地点”:{
“我不想要随机ID”:{
“服务”:{
“我要随机ID”:“姓名”
},
“title:”(我正在搜索的字符串)
}
等等等等等等
所以我试着缩小我的结果
firebase = urlopen('firebase.json').read().decode('utf-8')
aniIndex = json.loads(firebase)
aniIndex2 = aniIndex.get("Data")
aniIndex3 = aniIndex2.get("Site")
print(aniIndex3) #Returns the section I want to search into
现在我的问题是如何搜索标签,因为下一个标签是一个随机名称。所以我想,如果我可以搜索“Title”的文本并检查它的父标签。我已经尝试找到一种方法来做到这一点,但没有一种方法真正适合我的情况
编辑:我搞乱了Json结构,修复了(很抱歉现在是早上5点)我不认为这是最好的解决方案,但这里有一个可行的解决方案: 假设您的json如下所示:
print(d)
{
"Data": {
"Site": {
"(RandomId)": {
"Title": "Thing"
},
"(Text I want)": {
"Title": "(The string i'm searching for)"
}
}
}
}
然后使用两个递归函数:
def find_children(dic, value):
child, grandchild = '', ''
for k, v in dic.items():
if isinstance(v, dict):
child, grandchild = find_children(v, value)
if child:
break
else:
if value in v:
return k, v
return child, grandchild
def find_parent(dic, children):
parents = ''
for k, v in dic.items():
if isinstance(v, dict):
if children[0] in v.keys() and children[1] in v.values():
return k
else:
parents = find_parent(v, children)
return parents
你可以找到:
find_parent(d, find_children(d, "i'm searching"))
# '(Text I want)'
find_parent(d, find_children(d, "Thing"))
# '(RandomId)'
下面是一段代码,它似乎可以满足您的需要。如果您需要所有带有
title
标记的项目,请排除break
语句,并在循环中处理您想要的项目
data = {
"Data": {
"Site": {
"RandomID I don't want": {
"Service": {
"RandomID I want": "Namers"
},
"title": "(The string im searching for)"
}
}
}
}
for v in data["Data"]["Site"].values():
if "title" in v:
if v["title"] == "(The string im searching for)":
id_i_want = list(v["Service"].keys())[0]
break
print("Id I want: '{}'".format(id_i_want))
输出:
Id I want: 'RandomID I want'
Id I want:'RandomID I want'您可以使用类似于
.keys()
的东西,如果有json可用的键,它会为json提供可用的键。例如json[“data”]。如果json[“data”]是一个内部字典,keys()
将返回键。我可能只是缺少一些东西,但它会返回此错误“isinstance()arg 2必须是一个类型或类型元组”如果您复制粘贴答案,唯一的解释是,dict
已由其他内容分配,因此不再是python文本。您的解决方案适用于原始json,但我对其格式不正确表示歉意,但我刚刚将json编辑为正确的格式thing@Soul_kept是否确定已编辑的json是吗?从外观上看,我想要的RandomID不是标题的父标记;它变成了邻居的(服务)child标记,几乎不可能从im搜索的字符串中跟踪是的,这是我的问题。我不知道是否可能。它返回id,但它不按im搜索的字符串进行选择。它只返回第一次出现的“服务”。请参阅我在Chris的答案上留下的评论。@Soul\u我编辑了代码以搜索字符串,并返回id。