Как получить элемент из файла JSON по ключу?

#python #json

#python #json

Вопрос:

Итак, у меня есть этот JSON файл:

 {
  "test": {
    "1.0.0": {
      "by": "xpath",
      "locator": "//div/span/a"
    },
    "1.0.1": {
      "by": "xpath1",
      "locator": "//div/span"
    },
    "1.0.2": {
      "by": "xpath2",
      "locator": "//div/span"
    }
  },
  "test1": {
    "1.0.1": {
      "by": "id",
      "locator": "add"
    },
    "1.0.2": {
      "by": "id",
      "locator": "/ADD"
    }
  },
  "test2": {
    "1.0.1": {
      "by": "css",
      "locator": "div span"
    },
    "1.0.2": {
      "by": "css",
      "locator": "div span a"
    }
  }
}
  

И я хочу взять 2 ключа ( by и locator ) из требуемого элемента с именем test1 и номером версии 1.0.1 :

   "test1": {
    "1.0.1": {
      "by": "id",
      "locator": "add"
    },
  

Это то, что я попробовал:

 with open('file.json') as f:
    json_file = load(f)
  

Получить мой элемент:

 item = json_file.get('test1')

for x in item:
    if x == `1.0.1`_:
        print(item[x]['by'])
        print(item[x]['locator'])
  

Итак, это работает нормально, но мне интересно, как получить это в одной строке без этого for цикла.

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

1. Вам нужно изучить руководство по Python dicts. Это научит вас, как получить доступ к содержимому.

Ответ №1:

Как насчет индексации по ключу?

 import json

with open('file.json') as f:
    json_file = json.load(f)

json_file["test1"]["1.0.1"]["by"]
json_file["test1"]["1.0.1"]["locator"]
  

Вы могли бы обернуть эти вызовы в a try - except KeyError для перехвата, если ключи не существуют. Кроме того, вы можете явно проверить, существует ли ключ, прежде чем использовать его. Что-то вроде:

 if "1.0.1" in json_file["test1"]:
    print(json_file["test1"]["1.0.1"]["by"])
    print(json_file["test1"]["1.0.1"]["locator"])
  

Вы также можете использовать dict.get , и если это возвращает None , то ключ не существует.

 version_info = json_file["test1"].get("1.0.1", None)
if version_info is not None:  # exists
    print(json_file["test1"]["1.0.1"]["by"])
    print(json_file["test1"]["1.0.1"]["locator"])
  

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

1. Я хочу знать, существует ли эта версия в файле раньше

2. Я имею в виду, что если у меня версия 1.0.2, этот 1.0.1 тоже подойдет для меня

3. ХОРОШО, итак, ваш последний пример работает для меня, но если я хочу иметь возможность указать версию, которая не включена в файл, но последняя версия тоже хороша? например, в файле есть 1.0.0 и 1.0.4, но у меня версия 1.0.2, поэтому версия 1.0.0 — та, которую я хочу