Python JSON: кодування (дамп), декодування (завантаження) json даних & Файл (приклад)

Зміст:

Anonim

Що таке JSON?

JSON - це стандартний формат обміну даними, який натхненний JavaScript. Як правило, JSON є у рядковому або текстовому форматі. JSON позначає J AVA S cript O ▪ Таблиця N otation.

Синтаксис JSON: JSON записується як пара ключ і значення.

{"Key": "Value","Key": "Value",}

JSON дуже схожий на словник Python. Python підтримує JSON, і він має вбудовану бібліотеку як JSON.

Бібліотека JSON на Python

Зовнішні модулі Python ' marshal ' та ' pickle' підтримують версію бібліотеки 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_obj Person… {'name': 'John', 'sex': 'male'}

Розшифровка файлу JSON або розбір файлу JSON у Python

ПРИМІТКА. Розшифровка файлу JSON - це операція, пов’язана із введенням / виведенням файлів (введення / виведення). Файл 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

Складний об'єкт має дві різні частини, тобто

  1. Реальна частина
  2. Уявна частина

Приклад: 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. Якщо ні, то відкрийте термінал або 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 (повідомлення, документ)
  • Параметри винятку:
    • Повідомлення - Неформатоване повідомлення про помилку
    • doc - проаналізовано документи JSON
    • pos - індекс запуску документа, коли він не вдався
    • lineno - лінія немає шоу відповідає поз
    • двокрапка - стовпець no відповідає поз

Приклад,

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 - Запит на коментарі) не дозволяє нескінченне значення або значення Nan, але в бібліотеці Python-JSON немає обмежень для виконання операцій, пов’язаних з нескінченним значенням та значенням Nan. Якщо 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

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 та рівнів вкладеності об'єкта.

Чит-код

json.dumps (person_data)

Створіть об'єкт JSON

json.dump (person_data, file_write)

Створіть JSON-файл за допомогою файлового вводу-виводу 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 для серіалізації

json.loads (рядок_даних)

Розшифровка рядка JSON у словнику Python за допомогою функції json.loads ()

json.loads ('{"__ complex__": true, "real": 4, "img": 5}', object_hook = is_complex)

Розшифровка складного JSON-об'єкта на Python

JSONDecoder (). Декодування (рядок_кольору)

Використання декодування JSON до Python із десериалізацією