JSON данные

С самого начала JSON стал стандартом для обмена информацией.

Работа с JSON, это довольно распространенная задача, и, как и в случае большинства обычных задач, Python делает ее очень легкой.

ПРИМЕЧАНИЕ

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

Краткая история JSON

Не удивительно, что JavaScript Object Notation (объектная нотация JavaScript) была вдохновлена подмножеством языка программирования JavaScript, связанным с литеральным синтаксисом объекта. Не беспокойтесь: JSON уже давно стал независимым от языка и существует в качестве своего собственного стандарта, поэтому, мы можем избегать JavaScript ради этой дискуссии.

В конечном счете, сообщество в целом приняло JSON, потому что людям и машинам легко создавать и понимать его.

Посмотрим на JSON

JSON должен быть доступен для чтения любому, кто использовал язык Cи-стиля, а Python - язык Cи-стиля.

{
    "firstName": "Jane",
    "lastName": "Doe",
    "hobbies": ["running", "sky diving", "singing"],
    "age": 35,
    "children": [
        {
            "firstName": "Alice",
            "age": 6
        },
        {
            "firstName": "Bob",
            "age": 8
        }
    ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Как видите, JSON поддерживает примитивные типы, такие как строки и числа, а также вложенные списки и объекты.

ПРИМЕЧАНИЕ

Он похож на словарь Python! На данный момент это довольно универсальная система обозначений объектов.

Подключение JSON

Python поставляется со встроенным пакетом json для кодирования и декодирования данных JSON.

Просто подключив вверху вашего файла:

import json
1

Терминология

Процесс кодирования JSON обычно называется сериализацией. Этот термин относится к преобразованию данных в серию байтов (следовательно, последовательных) для хранения или передачи по сети.

десериализация - это взаимный процесс декодирования данных, которые были сохранены или добавлены в стандарте JSON.

Это звучит довольно технически. Определенно. Но на самом деле все, о чем мы здесь говорим - это чтение и письмо. Думайте об этом так: кодирование предназначено для записи данных на диск, а декодирование - для чтения данных в память.

Сериализация JSON

Что происходит после того, как компьютер обрабатывает много информации? Нужно взять дамп данных. Соответственно, библиотека json предоставляет метод dump() для записи данных в файлы. Существует также метод dumps() (произносится как «dump-s») для записи в строку Python.

Простые объекты Python переводятся в JSON в соответствии с довольно интуитивным преобразованием.

**Python**                  **JSON**
dict                =>      object
list, tuple         =>      array
str                 =>      objectstring
int, long, float    =>      number
True                =>      objecttrue
False               =>      objectstringfalse
None                =>      objectstringfalsenull
1
2
3
4
5
6
7
8

Пример сериализации

Представьте, что вы работаете с объектом Python в памяти, который выглядит примерно так:

data = {
    "president": {
        "name": "Zaphod Beeblebrox",
        "species": "Betelgeusian"
    }
}
1
2
3
4
5
6

Крайне важно сохранить эту информацию на диске, поэтому запишем ее в файл.

Создадим файл с именем data_file.json и откроем его в режиме записи. (Файлы JSON обычно заканчиваются расширением .json.)

with open("data_file.json", "w") as write_file:
    json.dump(data, write_file)
1
2

Обратите внимание, что dump() принимает два позиционных аргумента: (1) объект данных для сериализации и (2) файлоподобный объект, в который будут записаны байты.

Или, если хотите продолжать использовать эти сериализованные данные JSON в своей программе, вы можете записать их в собственный объект (переменную) Python.

json_string = json.dumps(data)
1

Обратите внимание, что файлоподобный объект отсутствует, так как вы фактически не записываете на диск. В остальном dumps() похожа на dump().

Некоторые полезные аргументы ключевого слова

Помните, что JSON должен легко читаться людьми, но читаемого синтаксиса недостаточно, если все это сжато вместе. Кроме того, вам может быть проще читать код, когда он отформатирован по вашему вкусу.

ПРИМЕЧАНИЕ

Методы dump() и dumps() используют одинаковые ключевые аргументы.

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

json.dumps (data, indent = 4)
1

Другой вариант форматирования - аргумент ключевого слова separators. По умолчанию это две строки разделителей (",", ":"), но распространенной альтернативой для компактного JSON является (",", ":"). Посмотрите на образец JSON еще раз, чтобы увидеть, где находятся разделители.

Упражнения

  1. Создайте словарь в файле с кодом, с рецептом и перечнем продуктов в нем. Сохраните исходные значения переменной в *.json файл.

Упражнения GUI

  1. Создайте программу с текстовым окном. В текстовом окне выведите пример рецепта в виде словаря. Словарь изначально храниться в значении переменной в коде.
  2. Добавьте кнопку сохранения файла, при нажатии на которую вызовется диалоговое окно выбора места сохранения. При выборе места сохранения файл будет сохраняться в виде .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
1
2
3
4
5
6
7
8
9

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

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

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

Пример десериализации

На этот раз представьте, что на диске хранятся некоторые данные, которыми вы хотели бы манипулировать в памяти. Откройте существующий data_file.json в режиме чтения.

with open("data_file.json", "r") as read_file:
    data = json.load(read_file)
1
2

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

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

json_string = """
{
    "researcher": {
        "name": "Ford Prefect",
        "species": "Betelgeusian",
        "relatives": [
            {
                "name": "Zaphod Beeblebrox",
                "species": "Betelgeusian"
            }
        ]
    }
}
"""
data = json.loads(json_string)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Вы познакомились с основами работы JSON в Python.

Упражнения

  1. Создайте программу которая прочитает .json файл (например с рецептом) преобразует его в словарь питон и выведет его значения в консоль.

Упражнения GUI

  1. Создайте программу с текстовым окном. В текстовом окне выведите пример рецепта в виде словаря, который прочитан из .json файла.
  2. Добавьте кнопку загрузки файла, при нажатии на которую вызовется диалоговое окно выбора открытия файла. При файла данные будут загружены в текстовое поле.
  3. Напишите программу с текстовым полем и кнопками "открыть", "сохранить" и "сохранить как", при нажатии на которые происходят соответствующие действия с .json файлами. Данные выводятся и считываются из текстового поля.
  4. Напишите "программу форму" генерирующую список состоящий из пар виджетов: Label и Entry. Текстом Label будет ключ, а текстом Entry - значение.
  5. Добавьте в "программу форму" кнопки: "открыть", "сохранить" и реализуйте их поведение.