Учебники

54) Python JSON

Что такое 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 Library of Python по умолчанию выполняет следующий перевод объектов Python в объекты JSON

питон JSON
ДИКТ объект
список массив
юникода строка
число — int, long число — int
поплавок число — реальное
Правда Правда
Ложь Ложь
Никто Значение NULL

Преобразование данных Python в JSON называется операцией кодирования. Кодирование выполняется с помощью метода библиотеки JSON — dumps ().

Метод dumps () преобразует объект словаря python в формат строковых данных JSON.

Теперь давайте выполним наш первый пример кодирования на Python.

import json

x = {
  "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 operation 
with open('json_file.json', "w") as file_write:
# write json data into file
json.dump(person_data, file_write)

Вывод:

Нечего показать … В вашей системе создан файл json_file.json, вы можете проверить этот файл.

JSON в Python (декодирование)

JSON строка декодирования выполняется с помощью встроенных методов нагрузок () и нагрузки () библиотеки JSON в Python. Здесь таблица перевода показывает пример объектов JSON в объекты Python, которые полезны для выполнения декодирования в Python строки JSON.

JSON питон
объект ДИКТ
массив список
строка юникода
число — int число — int, long
число — реальное поплавок
Правда Правда
Ложь Ложь
Значение NULL Никто

Давайте рассмотрим базовый пример декодирования в Python с помощью функции json.loads () ,

import json  # json library imported
# json data string
person_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_obj
print("Type of dict_obj", type(dict_obj))
# get human object details
print("Person......",  dict_obj.get('person'))

Вывод:

{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Type of dict_obj <class 'dict'>
Person...... {'name': 'John', 'sex': 'male'}

Расшифровка файла JSON или анализ файла JSON в Python

ПРИМЕЧАНИЕ. Декодирование файла JSON является операцией, связанной с вводом / выводом файла (I / O). Файл JSON должен существовать в вашей системе в указанном месте, которое вы упоминаете в своей программе.

Пример,

import json
#File I/O Open function for read data from JSON File
with open('X:/json_file.json') as file_object:
        # store file data in object
        data = json.load(file_object)
print(data)

Здесь данные — это словарь объекта Python.

Вывод:

{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}

Компактное кодирование в Python

Когда вам нужно уменьшить размер файла JSON, вы можете использовать компактную кодировку в Python.

Пример,

import json
# Create a List that contains dictionary
lst = ['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 dictionary
compact_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 json
dic = { '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 json

x = {
  "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)

Output:

{
    "age": 45,
    "cars": [ {
        "model": "Audi A1", 
        "mpg": 15.1
    },
    {
        "model": "Zeep Compass", 
        "mpg": 18.1
    }
    ],
    "children": [ "Alice",
		  "Bob"
	],
    "married": true,
    "name": "Ken",
    "pets": [ 
		"Dog"
	]
}

As you may observe the keys age, cars, children, etc are arranged in ascending order.

Сложное объектное кодирование Python

Сложный объект состоит из двух разных частей, которые

  1. Реальная часть
  2. Мнимая часть

Пример: 3 + 2i

Перед выполнением кодирования сложного объекта необходимо проверить, является ли переменная сложной или нет. Вам необходимо создать функцию, которая проверяет значение, хранящееся в переменной, используя метод экземпляра.

Давайте создадим специальную функцию для проверки, объект сложен или пригоден для кодирования.

import json

# create function to check instance is complex or not
def complex_encode(object):
    # check using isinstance method
    if isinstance(object, complex):
        return [object.real, object.imag]
    # raised error using exception handling if object is not complex
    raise TypeError(repr(object) + " is not JSON serialized")


# perform json encoding by passing parameter
complex_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 object
  def 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 not
  complex_object =json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook = is_complex)
  #here we not passed complex object so it's convert into dictionary
  simple_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 json
from json.encoder import JSONEncoder
colour_dict = { "colour": ["red", "yellow", "green" ]}
# directly called encode method of JSON
JSONEncoder().encode(colour_dict)

Вывод:

'{"colour": ["red", "yellow", "green"]}'

Обзор класса десериализации JSON JSONDecoder

Класс JSONDecoder используется для десериализации любого объекта Python при выполнении декодирования. Он содержит три различных метода декодирования, которые

  • default (o) — реализовано в подклассе и возвращает десериализованный объект o объект.
  • decode (o) — То же, что и метод json.loads (), возвращает структуру данных Python из строки или данных JSON.
  • raw_decode (o) — представляет словарь Python один за другим и декодирует объект o.

С помощью метода decode () класса JSONDecoder мы также можем декодировать строку JSON.

import json
# import JSONDecoder class from json
from json.decoder import JSONDecoder
colour_string = '{ "colour": ["red", "yellow"]}'
# directly called decode method of JSON
JSONDecoder().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 json
import requests

# get JSON string data from CityBike NYC using web requests library
json_response= requests.get("https://feeds.citibikenyc.com/stations/stations.json")
# check type of json_response object
print(type(json_response.text))
# load data in loads() function of json library
bike_dict = json.loads(json_response.text)
#check type of news_dict
print(type(bike_dict))
# now get stationBeanList key data from dict
print(bike_dict['stationBeanList'][0]) 

Вывод:

<class 'str'>
<class 'dict'>
{
	'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 — начать индекс документа, когда это не удалось
    • белье — линия не показывает соответствует поз
    • двоеточие — столбец не соответствует поз

Пример,

import json
#File I/O Open function for read data from JSON File
data = {} #Define Empty Dictionary Object
try:
        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 value
infinite_json = json.dumps(float('inf'))
# check infinite json type
print(infinite_json)
print(type(infinite_json))
json_nan = json.dumps(float('nan'))
print(json_nan)
# pass json_string as Infinity
infinite = json.loads('Infinity')
print(infinite)
# check type of Infinity
print(type(infinite))

Вывод:

Infinity
<class 'str'>
NaN
inf
<class 'float'>	

Повторный ключ в строке JSON

RFC указывает, что имя ключа должно быть уникальным в объекте JSON, но это не обязательно. Библиотека JSON Python не вызывает исключение повторяющихся объектов в JSON. Он игнорирует все повторяющиеся пары ключ-значение и рассматривает только последнюю пару ключ-значение среди них.

  • Пример,
import json
repeat_pair = '{"a":  1, "a":  2, "a":  3}'
json.loads(repeat_pair)

Вывод:

{'a': 3}

CLI (интерфейс командной строки) с JSON в Python

json.tool предоставляет интерфейс командной строки для проверки синтаксиса JSON pretty-print. Давайте посмотрим на пример CLI

$ echo '{"name" : "Kings Authur" }' | python3 -m json.tool

Вывод:

{
    "name": " Kings Authur "
}

Преимущества JSON в Python

  • Легко перемещаться назад между контейнером и значением (JSON в Python и Python в JSON)
  • Удобный для чтения (Pretty-print) объект JSON
  • Широко используется в обработке данных.
  • Не имеет одинаковую структуру данных в одном файле.

Ограничение реализации JSON в Python

  • В десериализаторе диапазона JSON и предсказании числа
  • Максимальная длина строки JSON и массивов JSON и уровней вложенности объекта.

Чит код

json.dumps (person_data)

Создать объект JSON

json.dump (person_data, file_write)

Создайте файл JSON с помощью файлового ввода-вывода Python

compact_obj = json.dumps (data, separators = (‘,’, ‘:’))

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

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

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

sorted_string = json.dumps (x, отступ = 4, sort_keys = True)

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

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

Кодирование сложных объектов Python в JSON

JSONEncoder (). Закодировать (colour_dict)

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

json.loads (data_string)

Расшифровка строки JSON в словаре Python с помощью функции json.loads ()

json.loads (‘{«__ complex__»: true, «real»: 4, «img»: 5}’, object_hook = is_complex)

Декодирование сложного объекта JSON в Python

JSONDecoder (). Декодирование (colour_string)

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