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

Содержание:

Anonim

Что такое 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
диктовать Объект
список Множество
юникод Нить
число - int, long число - int
плавать число - реальное
Истинный Истинный
Ложь Ложь
Никто Ноль

Преобразование данных 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
Объект диктовать
Множество список
Нить юникод
число - int число - 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 - это операция, связанная с вводом / выводом файлов (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)

Здесь 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 при выполнении кодирования. Он содержит три различных метода кодирования, которые

  • default (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 при выполнении декодирования. Он содержит три различных метода декодирования, которые

  • default (o) - Реализован в подклассе и возвращает десериализованный объект o object.
  • 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 (Bike Sharing System) по указанному 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 (msg, doc)
  • Параметры исключения:
    • msg - неформатированное сообщение об ошибке
    • doc - документы JSON проанализированы
    • pos - начальный индекс документа, когда он не удался
    • белье - линия не показывает соответствует поз.
    • двоеточие - столбец no соответствует pos

Пример,

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 - Request For Comments) не допускает бесконечных или Nan значений, но в 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

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 (данные_персонала, запись_файла)

Создание файла JSON с использованием файлового ввода-вывода Python

compact_obj = json.dumps (данные, разделители = (',', ':'))

Сжать объект JSON путем удаления символа пробела из объекта JSON с помощью разделителя

formatted_obj = json.dumps (dic, indent = 4, separators = (',', ':'))

Форматирование кода JSON с использованием отступа

sorted_string = json.dumps (x, indent = 4, sort_keys = True)

Сортировка ключа объекта JSON по алфавиту

complex_obj = json.dumps (4 + 5j, по умолчанию = complex_encode)

Кодировка сложных объектов 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 (). Decode (строка_цвета)

Использование декодирования JSON в Python с десериализацией