Python для проверки наличия вложенного значения ключа JSON

#python #python-3.x

Вопрос:

У меня есть JSON в заданном формате, и моя цель-определить, соответствует ли пара ключ-значение

«имя» : «Важно 1», «имя» : «Важно 2», «имя» : «Важно 3» существует под «ТЕГОМ 3» или нет?

Мне нужно сделать это с помощью Python. Есть какие-нибудь предложения? Я пробовал различные предложенные примеры, но ни один из них не может проанализировать данный пример.

 {
  "BASE": {
    "TAG1": [
      {
        "attr": {
          "name": "val1",
          "place": "val1"
        },
        "r1": 65535,
        "r2": 444
      },
      {
        "attr": {
          "name": "Important1",
          "place": "RPlace"
        },
        "r1": 65535,
        "r2": 109
      },
      {
        "attr": {
          "name": "Important2",
          "place": "GPlace"
        },
        "r1": 65535,
        "r2": 453
      },
      {
        "attr": {
          "name": "Important3",
          "place": "BPlace"
        },
        "r1": 65535,
        "r2": 109
      }
    ],
    "my-id": 2412922,
    "TAG2": [
      {
        "attr": {
          "name": "val1",
          "place": "val1"
        },
        "r1": 65535,
        "r2": 444
      },
      {
        "attr": {
          "name": "Important1",
          "place": "RPlace"
        },
        "r1": 65535,
        "r2": 109
      },
      {
        "attr": {
          "name": "Important2",
          "place": "GPlace"
        },
        "r1": 65535,
        "r2": 453
      },
      {
        "attr": {
          "name": "Important3",
          "place": "BPlace"
        },
        "r1": 65535,
        "r2": 109
      }
    ],
    "TAG3": [
      {
        "name": "POSITION",
        "place": "POSITION",
        "type": "M96"
      },
      {
        "name": "val1",
        "place": "val1"
      },
      {
        "name": "Important1",
        "place": "RPlace"
      },
      {
        "name": "Important2",
        "place": "GPlace"
      },
      {
        "name": "Important3",
        "place": "BPlace"
      }
    ],
    "out-box": {
      "r1": [
        6.2,
        7.3
      ],
      "r2": [
        6.2,
        7.3
      ]
    },
    "t1": "hldsadh1",
    "t2": 0,
    "t3": 20,
    "string-attr": [
      1,
      16
    ],
    "r1-chk": 342,
    "my-size": 34,
    "where": [
      2.9,
      54.9
    ],
    "sometag": 2,
    "revision": 0,
    "nodata": [
      0,
      0
    ],
    "noscale": [
      0.001,
      0.001
    ],
    "time-val": 3444
  }
}
 

Я попытался использовать функцию ниже, но из-за моих ограниченных знаний python я как бы застрял

 def keys_exists(element, *keys):
    """
    Check if *keys (nested) exists in `element` (dict).
    """
    if type(element) is not dict:
        raise AttributeError('keys_exists() expects dict as first argument.')
    if len(keys) == 0:
        raise AttributeError('keys_exists() expects at least two arguments, one given.')

    _element = element
    for key in keys:
        try:
            _element = _element[key]
        except KeyError:
            return False
    return True
 

Если я сохраняю JSON , которым я поделился, в переменной с именем data1 , то я пытаюсь использовать указанную выше функцию как

 keys_exists(data1, "BASE", "TAG3", "name")))
 

Пожалуйста, не стесняйтесь отказаться от моей версии и поделиться своей собственной.

Комментарии:

1. Можете ли вы показать, что вы пробовали.

2. @blueteeth — Я довольно новичок в python и в зависимости от проб и поиска. Я обновил вопрос, но вы можете поделиться совершенно новым подходом

Ответ №1:

Кажется, вы перебираете все подряд, вместо того чтобы пытаться извлечь то, что вам нужно. Я бы создал функцию, чтобы получить все имена для тега, затем вы можете проверить, существуют ли конкретные имена или нет.

 data = json.loads("""
<the json string goes here>
""")

def get_names_by_tag(tag):
    return [item["name"] for item in data["BASE"][tag]]

tag3_names = get_names_by_tag("TAG3")
# tag3_names = ['POSITION', 'val1', 'Important1', 'Important2', 'Important3']

important_names = ["Important1", "Important2", "Important3"]

if all(important_name in tag3_names for important_name in important_names):
    # do something
 

Комментарии:

1. С помощью этого кода я получаю ошибку ниже. Обратная связь (последний последний вызов): Файл «main.py», строка 137, в файле <module> tag3_names = get_names_by_tag(«TAG3») «main.py», строка 135, в get_names_by_tag возвращает [элемент[«имя»] для элемента в данных[«БАЗА»][тег]] Ошибка типа: строковые индексы должны быть целыми числами

2. Загрузили json в качестве диктанта?

3. Я очень новичок в python. Я только что назначил data = «‘ <данные json> «‘. Не могли бы вы подробнее рассказать?

4. Вам нужно загрузить строку json в объект python. Видишь docs.python.org/3/library/json.html#json.loads (и моя правка)

5. Ты уже все понял. all(...) в основном И-все в цикле. any(...) является эквивалентом для ИЛИ. 🙂