Поиск в JSON переменной, а затем возвращение имени родительского тега - PullRequest
0 голосов
/ 12 февраля 2019

Итак, я пытаюсь получить имя тега, который является родителем тега, который включает в себя мою переменную поиска, которая была определена ранее в моем цикле.Родительский тег всегда отличается.Вот структура 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 голосов
/ 12 февраля 2019

Вот немного кода, который, кажется, делает то, что вы хотите.Если вам нужны все элементы с тегом 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))

output:

Id I want: 'RandomID I want'
0 голосов
/ 12 февраля 2019

Я бы не назвал это лучшим решением, но вот рабочее:

Предположим, ваш 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)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...