Каким образом можно проверить, существует ли определённое поле в JSON файле с использованием Python?

Здравствуйте! <br/> У меня есть JSON файл с данными о сотрудниках, и я хочу вывести их фамилию и имя, а также проверить наличие отчества (MiddleName). Если отчество отсутствует, необходимо отобразить сообщение "Отчество отсутствует", а если оно есть - вывести само отчество. <br/> <pre><code class="json">"Employees": [
        {
            "User": {
                "UserId": "000",
                "Login": "[email protected]",
                "FullName": {
                    "LastName": "Иванов",
                    "FirstName": "Иван"
                },
                "Registered": true
            }
        ]</code></pre> <br/> <br/> Я перебираю весь JSON файл в цикле, но у меня не получается правильно проверить наличие отчества. <br/> Не могли бы вы помочь разобраться, в чем именно заключается моя ошибка? <br/> <pre><code class="python">for item in response.json()['Employees']:
    FirstName = str("Имя: "+item["User"]["FullName"]["FirstName"]+",")  # Получение имени
    LastName = str("Фамилия: "+item["User"]["FullName"]["LastName"]+",")  # Получение фамилии
    MiddleName = str(item["User"]["FullName"]["MiddleName"])  # Получение отчества
    if MiddleName.get("MiddleName") is None:
        print("Отчество отсутствует ")
    else:
        print(MiddleName.get("MiddleName"))
print(FirstName, LastName , MiddleName )</code></pre>
  • 18 ноября 2024 г. 17:33
Ответы на вопрос 4
Здравствуйте!

Для того чтобы проверить, существует ли поле в JSON файле, вы можете использовать конструкцию `if` для проверки наличия ключа в словаре. В вашем случае для проверки наличия отчества (`MiddleName`) лучше всего использовать оператор `in`.

Ниже приведён исправленный код:

```python
# Предполагается, что 'response' - это объект, возвращаемый библиотекой requests.
# Например, response = requests.get('url')

for item in response.json()['Employees']:
    FirstName = "Имя: " + item["User"]["FullName"]["FirstName"]  # Получение имени
    LastName = "Фамилия: " + item["User"]["FullName"]["LastName"]  # Получение фамилии
    
    # Проверка наличия поля MiddleName
    if "MiddleName" in item["User"]["FullName"]:
        MiddleName = "Отчество: " + item["User"]["FullName"]["MiddleName"]  # Получение отчества
        print(MiddleName)
    else:
        print("Отчество отсутствует")
    
    # Вывод фамилии и имени
    print(FirstName, LastName)
```

### Пояснения:
1. Мы используем `if "MiddleName" in item["User"]["FullName"]:` для проверки наличия ключа `MiddleName` в словаре `FullName`.
2. Если ключ существует, то мы получаем значение и выводим его, иначе выводим сообщение "Отчество отсутствует".
3. Важно помнить, что ваш первоначальный код использует `str()` для присвоения значений, это не обязательно, так как вы уже формируете строки. Также нет необходимости использовать `get`, когда вы проверяете наличие ключа с помощью `in`.

Эти изменения должны помочь вам правильно обрабатывать данные из JSON файла.
Ну так сначала проверяй наличие поля, а потом только доставай, а не наоборот, хотя метод get позволяет это совместить. И зачем ты еще к str приводишь?
Объекты типа str не имеют метода get, такие методы характерны для маппингов (ключ-значение) напрмиер словарь. 
get("MiddleName") нужно проверять в другом месте, где ты ожидаешь встретить данный ключ.
Применять метод .get() к строке не лучшее решение, попробуйте так: 
for item in response.json()['Employees']:
    first_name = item["User"]["FullName"]["FirstName"]
    last_name = item["User"]["FullName"]["LastName"]
    
    if "MiddleName" in item["User"]["FullName"]:
        middle_name = item["User"]["FullName"]["MiddleName"]
    else:
        middle_name = "отчество отсутствует"
    
    print(f"Имя: {first_name}, фамилия: {last_name}, отчество: {middle_name}")


# Имя: Иван, фамилия: Иванов, отчество: Иванович
# Имя: Петр, фамилия: Петров, отчество: отчество отсутствует
Похожие вопросы