Модуль json

Complex Object encoding of Python

A Complex object has two different parts that is

  1. Real part
  2. Imaginary part

Example: 3 +2i

Before performing encoding of a complex object, you need to check a variable is complex or not. You need to create a function which checks the value stored in a variable by using an instance method.

Let’s create the specific function for check object is complex or eligible for encoding.

import json

# create function to check instance is complex or not
def complex_encode(object):
    # check using isinstance method
    if isinstance(object, complex):
        return 
    # 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)

Output:

''

numpy scalars¶

It’s not possible (without a lot of hacks) to encode numpy scalars. This is the case because some numpy scalars (float64, and depending on Python version also int64) are subclasses of float and int. This means that the Python json encoder will stringify them without them ever reaching the custom encoders.

So if you really want to encode numpy scalars, you’ll have to do the conversion beforehand. For that purpose you can use encode_scalars_inplace, which mutates a nested data structure (in place!) to replace any numpy scalars by their representation. If you serialize this result, it can subsequently be loaded without further adaptations.

It’s not great, but unless the Python json module changes, it’s the best that can be done. See issue 18 for more details.

(obj)

Searches a data structure of lists, tuples and dicts for numpy scalars
and replaces them by their dictionary representation, which can be loaded
by json-tricks. This happens in-place (the object is changed, use a copy).

Основные методы

Метод json dump

Сериализует в JSON-подобный формат записывая его в (который поддерживает ) используя эту .

Если (по умолчанию: ), тогда ключи словаря не базового типа (, , , , ) будут пропущены, вместо того, чтобы вызывать исключение .

Модуль всегда создает объекты , не . Следовательно, должен поддерживать ввод .

Когда (по умолчанию), все не-ASCII символы в выводе будут экранированы последовательностями ,. Если , эти символы будут записаны как есть.

Когда (по умолчанию: ), тогда проверка циклических ссылок для типов контейнера будет пропущена, а такие ссылки будут вызывать (или ошибку серьёзнее).

Если (по умолчанию: ), при каждой попытке сериализировать значение , выходящее за допустимые пределы (, , ), будет возникать , в соответствии с сертификацией JSON. В случае если , будут использованы JavaScript аналоги (, , ).

Когда является неотрицательным целым числом или строкой, то объекты и массивы JSON будут выводиться с этим количеством отступов. Если уровень отступа равен 0, отрицательный или , будут использоваться новые строки без отступов. (по умолчанию) отражает наиболее компактное представление. Если строка (например, ), эта строка используется в качестве отступа.

должны быть tuple . По умолчанию используется значение если и при другом значении. Чтобы получить наиболее компактное представление JSON, вы должны указать .

Значение должно быть функцией. Он вызывается для объектов, которые не могут быть сериализованы. Функция должна вернуть кодируемую версию объекта JSON или вызывать . Если не указано, возникает ошибка .

Если (по умолчанию: ), ключи выводимого словаря будут отсортированы.

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

Метод json dumps

Сериализирует в строку формата JSON с помощью . Аргументы имеют то же значение, что и для .

Ключи в парах ключ/значение всегда являются строками. Когда словарь конвертируется в JSON, все ключи словаря преобразовываются в строки. Если в результате, сначала конвертировать его в JSON, а потом обратно, новый в словарь может отличаться от, то можно получить словарь идентичный исходному. Другими словами, если x имеет не строковые ключи.

Метод json load

Десериализует из (текстовый или бинарный файл, который поддерживает метод и содержит JSON документ) в объект Python используя эту таблицу конвертации.

— опциональная функция, которая применяется к результату декодирования объекта. Использоваться будет значение, возвращаемое этой функцией, а не полученный словарь . Эта функция используется для реализации пользовательских декодеров (например JSON-RPC).

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

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

В случае определения , он будет вызван для декодирования строк JSON int. По умолчанию, эквивалентен . Можно использовать другой тип данных или парсер для этого значения (например ).

В случае определения , он будет вызван для строк: , , . Может быть использован для вызова исключений при обнаружении недопустимых чисел JSON. больше не вызывается при .

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

Если десериализованные данные не являются допустимым документом JSON, возникнет .

Метод json loads

Десериализует (экземпляр , или , содержащий JSON документ) в объект Python используя таблицу конвертации.

Остальные аргументы аналогичны аргументам в , кроме кодировки, которая устарела либо игнорируется.

Если десериализованные данные не являются допустимым документом JSON, возникнет ошибка .

Создание объектов Array

В следующем примере показано создание объекта массива в javascript с использованием JSON, сохраните приведенный ниже код как json_array_object.htm

<html>
   <head>
      <title>Creation of array object in javascript using JSON</title>
      <script language = "javascript" >
         document.writeln("<h2>JSON array object</h2>");
         var books = { " Pascal " : ,  
				
            "Scala"  :     
         }    
         var i = 0
         document.writeln("<table border = '2'><tr>");
			
         for(i = 0;i<books. Pascal .length;i++) {	
            document.writeln("<td>");
            document.writeln("<table border = '1' width = 100 >");
            document.writeln("<tr><td><b>Name</b></td><td width = 50>" + books. Pascal .Name+"</td></tr>");
            document.writeln("<tr><td><b>Price</b></td><td width = 50>" + books. Pascal .price +"</td></tr>");
            document.writeln("</table>");
            document.writeln("</td>");
         }

         for(i = 0;i<books.Scala.length;i++) {
            document.writeln("<td>");
            document.writeln("<table border = '1' width = 100 >");
            document.writeln("<tr><td><b>Name</b></td><td width = 50>" + books.Scala.Name+"</td></tr>");
            document.writeln("<tr><td><b>Price</b></td><td width = 50>" + books.Scala.price+"</td></tr>");
            document.writeln("</table>");
            document.writeln("</td>");
         }
			
         document.writeln("</tr></table>");
      </script>
   </head>
   
   <body>
   </body>
</html>

Теперь давайте попробуем открыть Json Array Object с помощью IE или любого другого браузера с поддержкой javaScript. Это дает следующий результат —

JSON — схема

Схема JSON — это спецификация формата на основе JSON для определения структуры данных JSON. Он был написан по проекту IETF, срок действия которого истек в 2011 году. Схема JSON —

  • Описывает ваш существующий формат данных.
  • Четкая, понятная человеку и машинная документация.
  • Полная структурная проверка, полезная для автоматизированного тестирования.
  • Полная структурная проверка, проверка данных, предоставленных клиентом.

Десериализация JSON

Отлично, похоже вам удалось поймать экземпляр дикого JSON! Теперь нам нужно предать ему форму. В модуле json вы найдете load() и loads() для превращения кодированных данных JSON в объекты Python.

Как и сериализация, есть простая таблица конверсии для десериализации, так что вы можете иметь представление о том, как все выглядит.

JSON Python
object dict
array list
string str
number (int) int
number (real) float
true True
false False
null None

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

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

Python

blackjack_hand = (8, «Q»)
encoded_hand = json.dumps(blackjack_hand)
decoded_hand = json.loads(encoded_hand)

print(blackjack_hand == decoded_hand) # False

print(type(blackjack_hand)) # <class ‘tuple’>
print(type(decoded_hand)) # <class ‘list’>

print(blackjack_hand == tuple(decoded_hand)) # True

1
2
3
4
5
6
7
8
9
10

blackjack_hand=(8,»Q»)

encoded_hand=json.dumps(blackjack_hand)

decoded_hand=json.loads(encoded_hand)

print(blackjack_hand==decoded_hand)# False

print(type(blackjack_hand))# <class ‘tuple’>

print(type(decoded_hand))# <class ‘list’>

print(blackjack_hand==tuple(decoded_hand))# True

Кодировщики и декодировщики

Класс json.JSONDecoder(object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None) — простой декодер JSON.

Выполняет следующие преобразования при декодировании:

JSON Python
object dict
array list
string str
number (int) int
number (real) float
true True
false False
null None

Он также понимает NaN, Infinity, и -Infinity как соответствующие значения float, которые находятся за пределами спецификации JSON.

Класс json.JSONEncoder(skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)

Расширяемый кодировщик JSON для структур данных Python. Поддерживает следующие объекты и типы данных по умолчанию:

Python JSON
dict object
list, tuple array
str string
int, float number
True true
False false
None null

Пример схемы JSON

Ниже приведена базовая схема JSON, которая охватывает классическое описание каталога продукции —

{
   "$schema": "http://json-schema.org/draft-04/schema#",
   "title": "Product",
   "description": "A product from Acme's catalog",
   "type": "object",
	
   "properties": {
	
      "id": {
         "description": "The unique identifier for a product",
         "type": "integer"
      },
		
      "name": {
         "description": "Name of the product",
         "type": "string"
      },
		
      "price": {
         "type": "number",
         "minimum": 0,
         "exclusiveMinimum": true
      }
   },
	
   "required": 
}

Давайте проверим различные важные ключевые слова, которые можно использовать в этой схеме —

Sr.No. Ключевое слово и описание
1

$ схема

Ключевое слово $ schema указывает, что эта схема написана согласно черновой спецификации v4.

2

заглавие

Вы будете использовать это, чтобы дать название вашей схеме.

3

описание

Небольшое описание схемы.

4

тип

Ключевое слово type определяет первое ограничение для наших данных JSON: это должен быть объект JSON.

5

свойства

Определяет различные ключи и их типы значений, минимальные и максимальные значения, которые будут использоваться в файле JSON.

6

требуется

Это хранит список обязательных свойств.

7

минимальный

Это ограничение, накладываемое на значение, и представляет минимально допустимое значение.

8

exclusiveMinimum

Если присутствует «exclusiveMinimum» и имеет логическое значение true, экземпляр действителен, если он строго больше значения «минимума».

9

максимальная

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

10

exclusiveMaximum

Если присутствует «exclusiveMaximum» и имеет логическое значение true, экземпляр действителен, если он строго ниже значения «Maximum».

11

multipleOf

Числовой экземпляр действителен для «множественного значения», если результатом деления экземпляра по значению этого ключевого слова является целое число.

12

максимальная длина

Длина экземпляра строки определяется как максимальное количество ее символов.

13

MINLENGTH

Длина экземпляра строки определяется как минимальное количество ее символов.

14

шаблон

Экземпляр строки считается допустимым, если регулярное выражение соответствует экземпляру успешно.

Вы можете проверить http://json-schema.org для полного списка ключевых слов, которые можно использовать при определении схемы JSON. Приведенную выше схему можно использовать для проверки правильности следующего кода JSON:

JSON — Сравнение с XML

JSON и XML являются удобочитаемыми форматами и не зависят от языка. Они оба поддерживают создание, чтение и декодирование в реальных ситуациях. Мы можем сравнить JSON с XML, основываясь на следующих факторах:

Способ 1: Использование json.load () для чтения файла json в python

JSON Module Это встроенный модуль в Python3, который предоставляет нам возможности обработки файлов JSON, используя Отказ

Мы можем построить объект Python после того, как мы напрямую прочитаем файл JSON в Python, используя этот метод.

Предположить это файл JSON со следующим содержимым:

{
"name": "AskPython",
"type": "website",
"language": "Python"
}

Мы можем загрузить объекты JSON в объект Python, используя следующую программу. Теперь мы можем легко получить доступ к нему, используя {ключ: значение} Пары сопоставления словаря!

import json
 
with open("sample.json", "r") as rf:
    decoded_data = json.load(rf)
 
print(decoded_data)
# Check is the json object was loaded correctly
try:    
    print(decoded_data)
except KeyError:
    print("Oops! JSON Data not loaded correctly using json.loads()")

Выход

{'name': 'AskPython', 'type': 'website', 'language': 'Python'}
AskPython

Действительно, мы смогли правильно загружать наши объекты JSON из нашего файла!

Способ 2: Используйте IJSON для больших файлов JSON

Если ваш файл JSON достаточно велик, так что он дорого принести весь контент в память, лучший подход будет преобразовать содержимое файла в Потоки Использование Отказ

Поток представляет собой коллекцию объектов (так же, как объекты JSON), которые будут загружены на память Только по требованию Отказ Это означает, что наш погрузчик данных загружает данные «Lazy», то есть только при необходимости.

Это ослабляет требование памяти при работе с большими файлами. Содержание потока хранится во временном буфере, что позволяет справиться с гигабайтами файлов JSON!

Чтобы установить Используйте PIP!

pip install ijson

Теперь, чтобы поэкспериментировать, мы будем использовать несколько маленький файл JSON, так как он будет много времени для загрузки гигабайт данных!

Я буду использовать файл covid thumeries json, на это связь. Загрузите файл и переименуйте это как Отказ Размер файла должен составлять около 2 МБ.

import ijson

for prefix, type_of_object, value in ijson.parse(open("covid_timeseries.json")):
    print(prefix, type_of_object, value)

Образец вывода (несколько строк)

Yemen.item.date string 2020-4-13
Yemen.item map_key confirmed
Yemen.item.confirmed number 1
Yemen.item map_key deaths
Yemen.item.deaths number 0
Yemen.item map_key recovered
Yemen.item.recovered number 0
Yemen.item end_map None
Yemen.item start_map None
Yemen.item map_key date
Yemen.item.date string 2020-4-14
Yemen.item map_key confirmed
Yemen.item.confirmed number 1
Yemen.item map_key deaths
Yemen.item.deaths number 0
Yemen.item map_key recovered
Yemen.item.recovered number 0
Yemen.item end_map None
Yemen end_array None

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

В то время как Может быть медленным, кажется, работает в пределах меньшей памяти. Вы можете попробовать этот модуль, если вы работаете с большими файлами.

Чтение и парсинг json формата, запись данных в файл.

JavaScript Object Notation (JSON) — это независимый от языка формат обмена данными, представленный в текстовом виде и понятный человеку. Он был получен из стандарта языка программирования ECMAScript. Формат определяет маленький набор правил форматирования для переносимого представления структурированных данных.

Информация в формате JSON может быть представлена в двух видах:

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

Модуль предоставляет API, подобный стандартным библиотечным модулям .

Примечания:

  • JSON — это подмножество YAML 1.2. Объект JSON, создаваемый с значением разделителей по умолчанию, также является подмножеством YAML 1.0 и 1.1. Таким образом, этот модуль также можно использовать в качестве сериализатора YAML.
  • Сериализатор и десериализатор этого модуля по умолчанию сохраняют порядок ввода и вывода элементов. Порядок теряется только в том случае, если вложенные контейнеры неупорядочены.

json.dumps() – Создание объекта JSON

Мы можем закодировать объект Python в объект JSON с помощью метода .

Вы можете думать о как о сериализации объекта Python в объект Python JSON и возврате строки. Это необходимо, если вы хотите передавать данные через Интернет.

Закодированные данные указаны в таблице ниже для различных объектов Python.

объект дикт
массив список, кортеж
строка ул
номер перечисления, производные от int, float, int– и float
истинный Правда
ложный Ложный
нулевой Никто

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

Формат:

json_object = json.dumps(serializable_object)

Здесь – это объект Python, такой как список, строка и т. Д., Который Может быть сериализуемым. Это не может быть функция/лямбда и т. Д.

import json

python_object = 

json_object = json.dumps(python_object)

print(type(json_object), json_object)

Выход

Этот метод вызовет если объект не сериализуем.

>>> import json
>>> a = lambda x : x * 2
>>> a(2)
4
>>> json.dumps(a)
Traceback (most recent call last):
    raise TypeError(f'Object of type {o.__class__.__name__}
TypeError: Object of type function is not JSON serializable

Сортировка ключей словаря

Если мы передаем словарь Python в , мы можем указать другой параметр , который сделает объект Python json отсортированным по ключам.

import json

dict_obj = {1:"one", 20: "twenty", 5:"five"}

json_obj = json.dumps(dict_obj, sort_keys = True)

print(json_obj)

Выход

{"1": "one", "5": "five", "20": "twenty"}

Наш вывод действительно имеет отсортированные ключи.

ПРИМЕЧАНИЕ : числа преобразуются в строки, так как они закодированы в JSON. Он будет правильно десериализован обратно в целые числа при использовании соответствующих методов.

Довольно печать объектов Python JSON

Мы можем использовать параметр для указания уровня отступа. Обычно сделает вывод действительно хорошим.

import json

dict_obj = {1:"one", 20: "twenty", 5:"five"}

json_obj = json.dumps(dict_obj, sort_keys = True, indent = 4)

print(json_obj)

Выход

{
    "1": "one",
    "5": "five",
    "20": "twenty"
}

json.dump() – Дамп в файл

Мы также можем сбросить объект в файл, если вы хотите использовать его позже, используя другой метод .

Формат :

json.dump(data, file_object)

Метод принимает данные и записывает их в файловый объект.

Таким образом, вы можете открыть новый файл и записать в этот файл объект с помощью

import json

python_object = 

with open("sample.json", "w") as wf:
    json.dump(python_object, wf)

Выход

user@AskPython $ cat sample.json

Как вы можете видеть, объект Python действительно был сброшен в файл.

Теперь давайте возьмем объект JSON, который мы показали в первом примере, и сохраним его в файл.

import json

json_object = {
    "name": "John",
    "age": 42,
    "married": True,
    "qualifications": 
}

with open("sample.json", "w") as wf:
    json.dump(json_object, wf)

Выход

user@AskPython $ cat sample.json
{"name": "John", "age": 42, "married": true, "qualifications": }

Простой пример в JSON

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

{
   "book": 
}

После понимания вышеупомянутой программы мы попробуем другой пример. Давайте сохраним код ниже как json.htm

<html>
   <head>
      <title>JSON example</title>
      <script language = "javascript" >
         var object1 = { "language" : "Java", "author"  : "herbert schildt" };
         document.write("<h1>JSON with JavaScript example</h1>");
         document.write("<br>");
         document.write("<h3>Language = " + object1.language+"</h3>");  
         document.write("<h3>Author = " + object1.author+"</h3>");   

         var object2 = { "language" : "C++", "author"  : "E-Balagurusamy" };
         document.write("<br>");
         document.write("<h3>Language = " + object2.language+"</h3>");  
         document.write("<h3>Author = " + object2.author+"</h3>");   
  
         document.write("<hr />");
         document.write(object2.language + " programming language can be studied " + "from book written by " + object2.author);
         document.write("<hr />");
      </script>
   </head>
   
   <body>
   </body>
</html>

Теперь давайте попробуем открыть json.htm с помощью IE или любого другого браузера с поддержкой javascript, который выдает следующий результат:

Вы можете обратиться к главе «Объекты JSON» для получения дополнительной информации об объектах JSON.

JSON — Синтаксис

Давайте кратко рассмотрим основной синтаксис JSON. Синтаксис JSON в основном рассматривается как подмножество синтаксиса JavaScript; это включает в себя следующее —

  • Данные представлены в парах имя / значение.

  • В фигурных скобках хранятся объекты, и за каждым именем следует ‘:’ (двоеточие), пары имя / значение разделяются (запятая).

  • Квадратные скобки содержат массивы, а значения разделяются, (запятая).

Ниже приведен простой пример —

{
   "book": 
}

JSON поддерживает следующие две структуры данных —

  • Коллекция пар имя / значение — эта структура данных поддерживается различными языками программирования.

  • Упорядоченный список значений — включает массив, список, вектор или последовательность и т. Д.

JSON — DataTypes

Формат JSON поддерживает следующие типы данных —

Sr.No. Тип и описание
1

номер

формат с плавающей точкой двойной точности в JavaScript

2

строка

Unicode с двойными кавычками с обратной косой чертой

3

логический

правда или ложь

4

массив

упорядоченная последовательность значений

5

Значение

это может быть строка, число, истина или ложь, null т. д.

6

объект

неупорядоченный набор пар ключ: значение

7

Пробелы

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

8

null

опорожнить

Итоги

Поздравляю, теперь вы обладаете могущественной силой JSON для любых ваших потребностей в Python.

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

  1. Импорт модуля json
  2. Чтение данных с load() или loads()
  3. Обработка данных
  4. Запись измененных данных при помощи dump() или dumps()

Что вы будете делать с данными, после того как они загрузились в память — зависит от вашего случая. В целом, ваша задача — собрать данные из источника, извлечение полезной информации, и передача этой информации (или ее запись).

Сегодня вы проделали небольшое путешествие: вы поймали и приручили JSON, и вернулись домой как раз к ужину! И в качестве бонуса, научившись работать с модулем json, можете начать изучение модулей pickle и marshal.

Спасибо за внимание, и удачи с вашими начинаниями в Python!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector