在JSON中搜索变量,然后返回父标记的名称

时间:2019-02-12 05:49:03

标签: python json parsing

因此,我正在尝试获取标记名称的标记,该标记包含一个包含在循环的前面定义的搜索变量的标记。父标记始终是不同的。 继承人的json即时通讯的结构。

{
  "Data" : {
    "Site" : {
      "RandomID I don't want" : {
        "Service" : {
          "RandomID I want" : "Namers"
        },
        "title" : "(The string im searching for)"
      }

以此类推...

所以我尝试缩小结果

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

现在我的问题是我如何搜索标签,因为下一个标签是随机名称。因此,我想是否可以搜索“标题”的文本并检查其父标签。我试图找到一种方法来解决此问题,但对于我遇到的情况,没有任何解决方法

编辑:我搞砸了Json结构,已修复(抱歉,就像凌晨5点)

2 个答案:

答案 0 :(得分:1)

这里有一些代码似乎可以满足您的要求。如果您需要所有带有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'

答案 1 :(得分:0)

我不会将其称为最佳解决方案,但这是一个可行的解决方案:

假设您的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)'