Python json нет ключа

Проверьте, существует ли ключ, и итерируйте массив JSON, используя Python

Почему это явно in проверках и raise если они отсутствуют? Просто получите доступ к нему без проверки, и вы получите точно такое же поведение (за исключением KeyError вместо ValueError ).

Если вы хотите только проверить, существует ли ключ или нет

Если вы хотите проверить, есть ли значение для ключа

Возвращает значение по умолчанию, если отсутствует фактическое значение

Рекомендуется создавать вспомогательные служебные методы для подобных вещей, чтобы всякий раз, когда вам нужно было изменить логику проверки атрибута, она находилась в одном месте, и код был бы более читабельным для последователей.

Например, создайте вспомогательный метод (или класс JsonUtils со статическими методами) в json_utils.py :

def get_attribute(data, attribute, default_value): return data.get(attribute) or default_value 

а затем использовать его в своем проекте:

from json_utils import get_attribute def my_cool_iteration_func(data): data_to = get_attribute(data, 'to', None) if not data_to: return data_to_data = get_attribute(data_to, 'data', []) for item in data_to_data: print('The id is: %s' % get_attribute(item, 'id', 'null')) 

ВАЖНАЯ ЗАМЕТКА:

Читайте также:  Что такое зависимости php

Есть причина, по которой я использую data.get(attribute) or default_value вместо просто data.get(attribute, default_value) :

.get('my_key', 'nothing') # returns None .get('my_key') or 'nothing' # returns 'nothing' 

В моих приложениях получение атрибута со значением ‘null’ — это то же самое, что вообще не получать атрибут. Если ваше использование отличается, вы должны изменить это.

Источник

Python Check if key exists in JSON and iterate the JSON array

In this article, we will see how to perform the following JSON operations using Python.

  • Check if the key exists or not in JSON
  • Check if there is a value for a key, and return a default value if the key is missing
  • Iterate JSON array

Further Reading:

Check if the key exists or not in JSON

Let’s assume you received the following student, JSON. And you wanted to check if the percentage key is present or not in JSON data. if it is present directly to access its value instead of iterating the entire JSON.

import json studentJson ="""< "id": 1, "name": "john wick", "class": 8, "percentage": 75, "email": "jhon@pynative.com" >""" print("Checking if percentage key exists in JSON") student = json.loads(studentJson) if "percentage" in student: print("Key exist in JSON data") print(student["name"], "marks is: ", student["percentage"]) else: print("Key doesn't exist in JSON data")
Checking if percentage key exists in JSON Key exist in JSON data john wick marks is: 75

Note: We used json.loads() method to convert JSON encoded data into a Python dictionary. After turning JSON data into a dictionary, we can check if a key exists or not.

Check if there is a value for a key in JSON

We need a value of the key to be present in JSON so we can use this value in our system. In this case, we need to be sure that value is present for a key, and if it is none or not present, we use the default value.

Example to check if there is a value for a key in JSON

import json studentJson ="""< "id": 1, "name": "john wick", "class": null, "percentage": 75, "email": "jhon@pynative.com" >""" student = json.loads(studentJson) if not (student.get('email') is None): print("value is present for given JSON key") print(student.get('email')) else: print("value is not present for given JSON key")
value is present for given JSON key jhon@pynative.com

Return default value if the key is missing

Let’s see how to use a default value if the value is not present for a key. As you know, the json.loads method converts JSON data into Python dict so we can use the get method of dict class to assign a default value to the key if the value is missing.

import json studentJson ="""< "id": 1, "name": "john wick", "class": null, "percentage": 75, "email": "jhon@pynative.com" >""" student = json.loads(studentJson) if not (student.get('subject') is None): print("value is present for given JSON key") print(student.get('subject')) else: print("using a default value for a given key") print(student.get('subject', 'Science'))
value is not present for given JSON key using a default value for a given key Science

Python Find if the nested key exists in JSON

Most of the time, JSON contains so many nested keys. Let’s see how to access nested key-value pairs from JSON directly. Let’s assume you have the following JSON data. and you want to check and access the value of nested key marks.

Example 1: Access nested key directly

If you know that you always have the parent key present, then you can access the nested JSON key directly. In this case, we always have ‘class‘ and ‘student‘ keys so we can access nested key marks directly.

import json sampleJson = """ < "class":< "student":< "name":"jhon", "marks":< "physics":70, "mathematics":80 >> > >""" print("Checking if nested JSON key exists or not") sampleDict = json.loads(sampleJson) if 'marks' in sampleDict['class']['student']: print("Student Marks are") print("Printing nested JSON key directly") print(sampleDict['class']['student']['marks'])

Checking if nested JSON key exists or not Student Marks are Printing nested JSON key directly

Example 2: Access nested key using nested if statement

If you are not sure whether you always have the parent key present, in such cases, we need to access nested JSON using nested if statement, to avoid any exceptions.

import json sampleJson = """ < "class":< "student":< "name":"jhon", "marks":< "physics": 70, "mathematics": 80 >> > >""" print("Checking if nested JSON key exists or not") sampleDict = json.loads(sampleJson) if 'class' in sampleDict: if 'student' in sampleDict['class']: if 'marks' in sampleDict['class']['student']: print("Printing nested JSON key-value") print(sampleDict['class']['student']['marks'])

Iterate JSON Array

Many times nested JSON key contains a value in the form of an array or dictionary. In this case, if you need all values, we can iterate the nested JSON array. Let’s see the example.

import json sampleJson = """< "class":< "student":< "name":"jhon", "marks":< "physics": 70, "mathematics": 80 >, "subjects": ["sub1", "sub2", "sub3", "sub4"] > > >""" sampleDict = json.loads(sampleJson) if 'class' in sampleDict: if 'student' in sampleDict['class']: if 'subjects' in sampleDict['class']['student']: print("Iterating JSON array") for sub in sampleDict['class']['student']['subjects']: print(sub)
Iterating JSON array sub1 sub2 sub3 sub4

So What Do You Think?

I want to hear from you. What do you think of this article? Let me know by leaving a comment below.

Also, try to solve the Python JSON Exercise to have a better understanding of Working with JSON Data in Python.

Did you find this page helpful? Let others know about it. Sharing helps me continue to create free Python resources.

About Vishal

I’m Vishal Hule, Founder of PYnative.com. I am a Python developer, and I love to write articles to help students, developers, and learners. Follow me on Twitter

Python Exercises and Quizzes

Free coding exercises and quizzes cover Python basics, data structure, data analytics, and more.

  • 15+ Topic-specific Exercises and Quizzes
  • Each Exercise contains 10 questions
  • Each Quiz contains 12-15 MCQ

Источник

Check if a Key Exists in a JSON String or not in Python

In this tutorial, we will learn how to check if a key exists in a JSON (JavaScript Object Notation) string or not using Python.

JSON is a popular and special type of data format used for data manipulation. So, let’s see…..

Python Program to Check if a Key Exists in a JSON String

First, let’s consider the following JSON string.

To detect whether a key exists in the above JSON formatted string or not, you should use the ‘in’ keyword as Python treats the above JSON data as String. See the below code and try to understand:

json_string='' if "website" in json_string: print("The required key is present") else: print("The required key is absent")

The output of the above program will be:

The required key is present

As the ‘website’ key is present in the json_string, so the ‘if’ block is executed.

We can not access the values using the keys in this method. To access the values you should convert the JSON string into a python dictionary by using ‘json.loads()’ method after importing the ‘json’ module. Then you can check whether a key exists in the dictionary or not and if it exists, you can access the value. See the following code.

import json json_string='' python_dict=json.loads(json_string) if "website" in python_dict: print("The required key is present") print("The value is="+str(python_dict["website"])) else: print("The required key is absent")

And below is the output result:

The required key is present The value is=codespeedy

Источник

Python parse json: как обработать исключение, когда в словаре нет ключа?

Пытаюсь разобрать json с глубокой вложенностью, до 10 элементов, как обработать исключение, когда в словаре нет ключа?

d = json.loads(file) print( d['date'], d['тип'], d['инн'], d['кпп'], d['огрн'], d['имяПолное'], d['имяКраткое'], d['оснВидДеятельности']['код'], d['оснВидДеятельности']['наим'], d['свАдрес']['адресРФ']['кодАдрКладр'] 

) Последнего элемента к примеру нет(может быть в другом файле), получаю ошибку:

d['свАдрес']['адресРФ']['кодАдрКлад'] KeyError: 'кодАдрКлад' 

Хотел написать обработчик, но че т не очень получилось, ошибка та же

def get_err(s): try: return s except: return '' 

В принт все показываю для отладки, в идеале нужно собрать значения ключей в строку с разделителем ; для последующего импорта в бд

Ответы (5 шт):

Перехватывать исключение нужно в момент когда вы обращаетесь к ключу т.е.:

try d['some_key'] except KeyError: return '' 
d = json.loads(file) class JsonNode(dict): def __getitem__(self, key): if key in self: item = super().__getitem__(key) if isinstance(item, dict): return JsonNode(item) else: return item else: return JsonNode() def __repr__(self): return str(dict(self)) if self else str(None) d = JsonNode(d) 

При обращении по несуществующему ключу возвращает пустой объект. Поддерживает произвольную вложенность, даже если после несуществующего ключа идёт ещё несколько подключей.

При выводе через print или преобразовании к строке, пустой объект отображается как None.

Писал на сорую руку, так что, возможно, что-то надо допилить и отладить, но в целом принцип такой.

s = d[‘тип’] + ‘;’ + d[‘свАдрес’][‘адресРФ’][‘кодАдрКладр’] . Если d[‘свАдрес’][‘адресРФ’][‘кодАдрКладр’] отсутствует в словаре то None ну или пробел

Чтобы вернуть значение по ключу или None , можно использовать d.get(‘тип’) .

from functools import reduce def get_by_path(d, *path, default=None): try: return reduce(dict.__getitem__, path, d) except KeyError: return default 

Пример: get_by_path(d, ‘оснВидДеятельности’, ‘код’) или:

s = ';'.join([get_by_path(d, *path, default=' ') for path in [['тип'], ['свАдрес', 'адресРФ', 'кодАдрКладр']]]) 

Я в итоге решил так, может кому пригодится:

def check_sl(d, k): if k[0] in d.keys(): try: if d[k[0]] is None: # print('1') return ' ' else: if len(k) > 1: # print('2') return check_sl(d[k[0]],k[1:]) else: # print('3', str(d[k[0]])) return str(d[k[0]]) except: return ' ' else: return ' ' check_sl(d,['оснВидДеятельности','код']) 

Можно не обрабатывать исключение, а установить дефолтное значение для несуществующего ключа:

from collections import defaultdict d = json.loads(file) new_json = defaultdict( lambda x=None: 'Ключ не найден', d ) 

Источник

Оцените статью