Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在JSON中搜索变量,然后返回父标记的名称_Python_Json_Parsing - Fatal编程技术网

Python 在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

因此,我试图获取一个标记的名称,该标记包含我的搜索变量,该变量是在我的循环中早些时候定义的。父标记总是不同的。 下面是我正在使用的json的结构

{
“数据”:{
“地点”:{
“我不想要随机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。