Какво е JSON?
JSON е стандартен формат за обмен на данни, който е вдъхновен от JavaScript. Като цяло JSON е в низ или текстов формат. JSON означава J ava S cript O bject N otation.
Синтаксисът на JSON: JSON се записва като двойка ключ и стойност.
{"Key": "Value","Key": "Value",}
JSON е много подобен на речника на Python. Python поддържа JSON и има вградена библиотека като JSON.
JSON библиотека в Python
„ marshal “ и „ pickle“ външни модули на Python поддържат версия на JSON библиотека. За да извършите операции, свързани с JSON, като кодиране и декодиране в Python, първо трябва да импортирате JSON библиотека и за това във вашия .py файл,
import json
Следните методи са налични в модула JSON
Метод | Описание |
---|---|
сметища () | кодиране към JSON обекти |
изхвърляне () | кодирано писане на низове във файл |
товари () | Декодирайте JSON низ |
зареждане () | Декодирайте, докато четете JSON файл |
Python към JSON (кодиране)
JSON библиотеката на Python по подразбиране извършва превод на обекти на Python в JSON обекти
Python | JSON |
дикт | Обект |
списък | Масив |
unicode | Струна |
номер - int, long | номер - вътрешно |
плувка | число - реално |
Вярно | Вярно |
Невярно | Невярно |
Нито един | Нула |
Преобразуването на данни от Python в JSON се нарича операция за кодиране. Кодирането се извършва с помощта на JSON библиотечен метод - dumps ()
методът dumps () преобразува обекта на речника на python в JSON формат на низови данни.
Сега позволява да изпълним първия си пример за кодиране с Python.
import jsonx = {"name": "Ken","age": 45,"married": True,"children": ("Alice","Bob"),"pets": ['Dog'],"cars": [{"model": "Audi A1", "mpg": 15.1},{"model": "Zeep Compass", "mpg": 18.1}]}# sorting result in asscending order by keys:sorted_string = json.dumps(x, indent=4, sort_keys=True)print(sorted_string)
Изход:
{"person": {"name": "Kenn", "sex": "male", "age": 28}})
Нека създадем JSON файл на речника, използвайки същата функция dump ()
# here we create new data_file.json file with write mode using file i/o operationwith open('json_file.json', "w") as file_write:# write json data into filejson.dump(person_data, file_write)
Изход:
Нищо за показване
... Във вашата система е създаден json_file.json, можете да проверите този файл.JSON към Python (декодиране)
JSON низ декодиране е направено с помощта на вградени метод товари () и натоварване () на JSON библиотека в Python. Тук таблицата за преводи показва пример на JSON обекти към Python обекти, които са полезни за извършване на декодиране в Python на JSON низ.
JSON | Python |
Обект | дикт |
Масив | списък |
Струна | unicode |
номер - вътрешно | номер - int, long |
число - реално | плувка |
Вярно | Вярно |
Невярно | Невярно |
Нула | Нито един |
Нека видим основен пример за декодиране в Python с помощта на функцията json.loads () ,
import json # json library imported# json data stringperson_data = '{ "person": { "name": "Kenn", "sex": "male", "age": 28}}'# Decoding or converting JSON format in dictionary using loads()dict_obj = json.loads(person_data)print(dict_obj)# check type of dict_objprint("Type of dict_obj", type(dict_obj))# get human object detailsprint("Person… ", dict_obj.get('person'))
Изход:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}Type of dict_objPerson… {'name': 'John', 'sex': 'male'}
Декодиране на JSON файл или анализиране на JSON файл в Python
ЗАБЕЛЕЖКА: Декодирането на JSON файл е свързана с входящи / извеждани файлове (I / O). JSON файлът трябва да съществува във вашата система на определеното място, което споменавате в програмата си.
Пример,
import json#File I/O Open function for read data from JSON Filewith open('X:/json_file.json') as file_object:# store file data in objectdata = json.load(file_object)print(data)
Тук данните са обект на речника на Python.
Изход:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Компактно кодиране в Python
Когато трябва да намалите размера на вашия JSON файл, можете да използвате компактно кодиране в Python.
Пример,
import json# Create a List that contains dictionarylst = ['a', 'b', 'c',{'4': 5, '6': 7}]# separator used for compact representation of JSON.# Use of ',' to identify list items# Use of ':' to identify key and value in dictionarycompact_obj = json.dumps(lst, separators=(',', ':'))print(compact_obj)
Изход:
'["a", "b", "c", {"4": 5, "6": 7}]'** Here output of JSON is represented in a single line which is the most compact representation by removing the space character from compact_obj **
Форматирайте JSON код (Доста щампа)
- Целта е да се напише добре форматиран код за разбиране от човека. С помощта на красив печат всеки може лесно да разбере кода.
- Пример,
import jsondic = { 'a': 4, 'b': 5 }''' To format the code use of indent and 4 shows number of space and use of separator is not necessary but standard way to write code of particular function. '''formatted_obj = json.dumps(dic, indent=4, separators=(',', ': '))print(formatted_obj)
Изход:
{"a" : 4,"b" : 5}
За да разберете по-добре това, променете отстъпа на 40 и наблюдавайте изхода-
Поръчка на JSON кода:
атрибутът sort_keys в аргумента на функцията dumps () ще сортира ключа в JSON във възходящ ред. Аргументът sort_keys е булев атрибут. Когато е вярно, сортирането е разрешено, иначе не
Пример,
import jsonx = {"name": "Ken","age": 45,"married": True,"children": ("Alice", "Bob"),"pets": [ 'Dog' ],"cars": [{"model": "Audi A1", "mpg": 15.1},{"model": "Zeep Compass", "mpg": 18.1}],}# sorting result in asscending order by keys:sorted_string = json.dumps(x, indent=4, sort_keys=True)print(sorted_string)
Изход:
{"age": 45,"cars": [ {"model": "Audi A1","mpg": 15.1},{"model": "Zeep Compass","mpg": 18.1}],"children": [ "Alice","Bob"],"married": true,"name": "Ken","pets": ["Dog"]}
Както можете да наблюдавате възрастта на ключовете, колите, децата и т.н. са подредени във възходящ ред.
Сложно кодиране на обект на Python
Комплексният обект има две различни части, т.е.
- Реална част
- Въображаема част
Пример: 3 + 2i
Преди да извършите кодиране на сложен обект, трябва да проверите дали дадена променлива е сложна или не. Трябва да създадете функция, която проверява стойността, съхранена в променлива, чрез метод на екземпляр.
Нека създадем специфичната функция за обект за проверка, която е сложна или отговаря на условията за кодиране.
import json# create function to check instance is complex or notdef complex_encode(object):# check using isinstance methodif isinstance(object, complex):return [object.real, object.imag]# raised error using exception handling if object is not complexraise TypeError(repr(object) + " is not JSON serialized")# perform json encoding by passing parametercomplex_obj = json.dumps(4 + 5j, default=complex_encode)print(complex_obj)
Изход:
'[4.0, 5.0]'
Сложно JSON декодиране на обект в Python
За да декодирате сложен обект в JSON, използвайте параметър object_hook, който проверява дали JSON низът съдържа сложния обект или не. Пример,
import json# function check JSON string contains complex objectdef is_complex(objct):if '__complex__' in objct:return complex(objct['real'], objct['img'])return objct# use of json loads method with object_hook for check object complex or notcomplex_object =json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook = is_complex)#here we not passed complex object so it's convert into dictionarysimple_object =json.loads('{"real": 6, "img": 7}', object_hook = is_complex)print("Complex_object… ",complex_object)print("Without_complex_object… ",simple_object)
Изход:
Complex_object… (4+5j)Without_complex_object… {'real': 6, 'img': 7}
Преглед на JSON клас сериализация JSONEncoder
Класът JSONEncoder се използва за сериализиране на всеки Python обект, докато изпълнява кодиране. Той съдържа три различни метода на кодиране, които са
- по подразбиране (o) - Реализирано в подкласа и връща сериализира обект за o обект.
- encode (o) - Същото като метода json.dumps () връща JSON низ от структурата на данни на Python.
- iterencode (o) - Представят низ един по един и кодират обект o.
С помощта на метода encode () от клас JSONEncoder можем да кодираме всеки Python обект.
# import JSONEncoder class from jsonfrom json.encoder import JSONEncodercolour_dict = { "colour": ["red", "yellow", "green" ]}# directly called encode method of JSONJSONEncoder().encode(colour_dict)
Изход:
'{"colour": ["red", "yellow", "green"]}'
Преглед на JSON клас на десериализация JSONDecoder
Класът JSONDecoder се използва за десериализация на всеки Python обект, докато изпълнява декодиране. Той съдържа три различни метода за декодиране, които са
- по подразбиране (o) - Внедрено в подкласа и връща десериализиран обект o обект.
- decode (o) - Същото като метода json.loads () връща Python структура от данни на JSON низ или данни.
- raw_decode (o) - Представят речник на Python един по един и декодират обект o.
С помощта на метода decode () от клас JSONDecoder можем да декодираме и JSON низ.
import json# import JSONDecoder class from jsonfrom json.decoder import JSONDecodercolour_string = '{ "colour": ["red", "yellow"]}'# directly called decode method of JSONJSONDecoder().decode(colour_string)
Изход:
{'colour': ['red', 'yellow']}
Декодиране на JSON данни от URL: Пример от реалния живот
Ще извлечем данни за CityBike NYC (система за споделяне на велосипеди) от посочен URL адрес (https://feeds.citibikenyc.com/stations/stations.json) и ще конвертираме във формат на речника.
Пример,
ЗАБЕЛЕЖКА: - Уверете се, че библиотеката за заявки вече е инсталирана във вашия Python, ако не, отворете Terminal или CMD и въведете
- (За Python 3 или по- нова версия ) заявки за инсталиране на pip3
import jsonimport requests# get JSON string data from CityBike NYC using web requests libraryjson_response= requests.get("https://feeds.citibikenyc.com/stations/stations.json")# check type of json_response objectprint(type(json_response.text))# load data in loads() function of json librarybike_dict = json.loads(json_response.text)#check type of news_dictprint(type(bike_dict))# now get stationBeanList key data from dictprint(bike_dict['stationBeanList'][0])
Изход:
{'id': 487,'stationName': 'E 20 St & FDR Drive','availableDocks': 24,'totalDocks': 34,'latitude': 40.73314259,'longitude': -73.97573881,'statusValue': 'In Service','statusKey': 1,'availableBikes': 9,'stAddress1': 'E 20 St & FDR Drive','stAddress2': '','city': '','postalCode': '','location': '','altitude': '','testStation': False,'lastCommunicationTime': '2018-12-11 10:59:09 PM', 'landMark': ''}
Изключения, свързани с JSON библиотека в Python:
- Класът json.JSONDecoderError обработва изключението, свързано с операция за декодиране. и това е подклас на ValueError.
- Изключение - json.JSONDecoderError (съобщение, документ)
- Параметрите на изключението са,
- msg - Съобщение за неформатирана грешка
- doc - JSON документи анализирани
- pos - начален индекс на doc, когато е неуспешен
- lineno - линия не показва показва съответства на поз
- дебело черво - колона № съответства на поз
Пример,
import json#File I/O Open function for read data from JSON Filedata = {} #Define Empty Dictionary Objecttry:with open('json_file_name.json') as file_object:data = json.load(file_object)except ValueError:print("Bad JSON file format, Change JSON File")
Безкрайни и NaN числа в Python
Форматът за обмен на данни JSON (RFC - Искане за коментари) не позволява Infinite или Nan Value, но в Python-JSON Library няма ограничение за извършване на операция, свързана с Infinite и Nan Value. Ако JSON получи INFINITE и Nan тип данни, отколкото го преобразува в буквален.
Пример,
import json# pass float Infinite valueinfinite_json = json.dumps(float('inf'))# check infinite json typeprint(infinite_json)print(type(infinite_json))json_nan = json.dumps(float('nan'))print(json_nan)# pass json_string as Infinityinfinite = json.loads('Infinity')print(infinite)# check type of Infinityprint(type(infinite))
Изход:
InfinityNaNinf
Повтарящ се ключ в JSON String
RFC посочва, че името на ключа трябва да бъде уникално в JSON обект, но не е задължително. Python JSON библиотеката не създава изключение от повтарящи се обекти в JSON. Той игнорира всички повторени двойки ключ-стойност и разглежда само последната двойка ключ-стойност сред тях.
- Пример,
import jsonrepeat_pair = '{"a": 1, "a": 2, "a": 3}'json.loads(repeat_pair)
Изход:
{'a': 3}
CLI (интерфейс на командния ред) с JSON в Python
json.tool предоставя интерфейс на командния ред за валидиране на синтаксиса на JSON за доста печат. Нека да видим пример за CLI
$ echo '{"name" : "Kings Authur" }' | python3 -m json.tool
Изход:
{"name": " Kings Authur "}
Предимства на JSON в Python
- Лесно за връщане между контейнер и стойност (JSON към Python и Python към JSON)
- Четимо от човека (доста щампа) JSON обект
- Широко се използва при обработка на данни.
- Няма същата структура на данните в отделния файл.
Ограничение на изпълнението на JSON в Python
- В десериализатор на JSON диапазон и предсказване на число
- Максималната дължина на JSON низ и масиви от JSON и нива на влагане на обект.
Cheat Code
json.dumps (person_data) |
Създайте JSON обект |
json.dump (person_data, file_write) |
Създайте JSON файл с помощта на File I / O на Python |
compact_obj = json.dumps (данни, разделители = (',', ':')) |
Компактен JSON обект чрез премахване на интервал от JSON обект с помощта на разделител |
formatted_obj = json.dumps (dic, отстъп = 4, разделители = (',', ':')) |
Форматиране на JSON код с отстъп |
sorted_string = json.dumps (x, отстъп = 4, sort_keys = True) |
Сортиране на JSON обектния ключ по азбучен ред |
complex_obj = json.dumps (4 + 5j, по подразбиране = комплексен_код) |
Кодиране на сложен обект на Python в JSON |
JSONEncoder (). Кодиране (colour_dict) |
Използване на JSONEncoder Class за сериализация |
json.loads (data_string) |
Декодиране на JSON String в речника на Python с помощта на функцията json.loads () |
json.loads ('{"__ complex__": true, "real": 4, "img": 5}', object_hook = is_complex) |
Декодиране на сложен JSON обект в Python |
JSONDecoder (). Декодиране (colour_string) |
Използване на декодиране на JSON към Python с десериализация |