Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Python

Python JSON: кодирование, декодирование и работа с файлами — практическое руководство

Что такое JSON в Python?

JSON — сокращение от JavaScript Object Notation — наиболее широко используемый текстовый формат обмена данными. В Python он напрямую отображается на нативные структуры данных: объекты становятся dict, массивы — list, строки, числа, булевы значения и null переводятся в str, int/float, bool и None соответственно. Модуль json в стандартной библиотеке обрабатывает все преобразования.

Библиотека JSON в Python

Импортируйте модуль один раз в скрипте:

import json

Модуль предлагает четыре основных метода:

МетодОписание
dumps()Преобразовать Python объект в JSON строку.
dump()Записать JSON строку напрямую в файловый объект.
loads()Распарсить JSON строку в Python объект.
load()Прочитать и распарсить JSON файл в Python объект.

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

Кодирование — процесс преобразования типов Python в JSON. Стандартное отображение показано ниже:

PythonJSON
dictObject
listArray
str/unicodeString
int/longNumber (int)
floatNumber (real)
Truetrue
Falsefalse
Nonenull

Пример с json.dumps():

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}
    ]
}
# Красивая печать с сортировкой ключей
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" ]
}

Запись JSON объекта в файл проста с json.dump():

with open('json_file.json', 'w') as file_write:
    json.dump(x, file_write, indent=4, sort_keys=True)

После запуска скрипта json_file.json будет содержать сериализованные данные.

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

Декодирование обращает отображение, превращая JSON строку или файл обратно в нативные Python объекты. Таблица преобразования зеркалит таблицу кодирования:

JSONPython
Objectdict
Arraylist
Stringstr
Number (int)int
Number (real)float
trueTrue
falseFalse
nullNone

Пример с json.loads():

import json
person_data = '{"person": {"name": "Kenn", "sex": "male", "age": 28}}'
obj = json.loads(person_data)
print(obj)
print(type(obj))
print(obj.get('person'))

Вывод:

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

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

Чтение JSON файла напрямую:

with open('json_file.json') as f:
    data = json.load(f)
print(data)

Вывод:

{'name': 'Ken', 'age': 45, ...}

Компактная и красивая печать

Для сетевой передачи компактное кодирование убирает пробелы:

lst = ['a', 'b', 'c', {"4": 5, "6": 7}]
compact = json.dumps(lst, separators=(',', ':'))
print(compact)

Вывод:

["a","b","c",{"4":5,"6":7}]

Для читаемости человеком красивая печать использует отступы:

dic = {"a": 4, "b": 5}
pretty = json.dumps(dic, indent=4, separators=(',', ': '))
print(pretty)

Вывод:

{
    "a": 4,
    "b": 5
}

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

Модуль json не может сериализовать произвольные объекты. Для обработки complex числа передайте функцию default:

def complex_encode(o):
    if isinstance(o, complex):
        return [o.real, o.imag]
    raise TypeError(f"{repr(o)} is not JSON serializable")

print(json.dumps(4 + 5j, default=complex_encode))

Вывод:

[4.0, 5.0]

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

Используйте object_hook для обнаружения пользовательского маркера и восстановления комплексного числа:

def is_complex(obj):
    if "__complex__" in obj:
        return complex(obj["real"], obj["img"])
    return obj

complex_obj = json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook=is_complex)
print(complex_obj)

Вывод:

(4+5j)

Классы сериализации и десериализации

Классы JSONEncoder и JSONDecoder обеспечивают детальный контроль:

Пример:

from json.encoder import JSONEncoder
print(JSONEncoder().encode({"colour": ["red", "yellow", "green"]}))

Получение JSON по URL

Использование requests для загрузки живого JSON фида (например, CityBike NYC):

import json, requests
response = requests.get("https://feeds.citibikenyc.com/stations/stations.json")
bike_dict = json.loads(response.text)
print(bike_dict['stationBeanList'][0])

Вывод:

{ 'id': 487, 'stationName': 'E 20 St & FDR Drive', 'availableDocks': 24, ... }

Обработка исключений JSON

Основное исключение — json.JSONDecodeError, подкласс ValueError. Пример обработки:

try:
    with open('bad.json') as f:
        data = json.load(f)
except json.JSONDecodeError as e:
    print(f"Bad JSON: {e}")

Специальные числовые значения

RFC 8259 не допускает Infinity или NaN, но Python энкодер представляет их как строки:

print(json.dumps(float('inf')))
print(json.dumps(float('nan')))

Вывод:

Infinity
NaN

Повторяющиеся ключи в JSON

Когда ключ встречается несколько раз, Python json.loads() сохраняет только последнее вхождение:

json.loads('{"a": 1, "a": 2, "a": 3}')  # -> {'a': 3}

Инструменты командной строки

Модуль json.tool форматирует и валидирует JSON из командной строки:

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

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

Ограничения

Шпаргалка по Python JSON

ФункцияОписание
json.dumps(obj)Сериализовать Python объект в JSON строку.
json.dump(obj, file)Записать JSON строку в файл.
json.dumps(obj, separators=(",", ":"))Компактное представление без пробелов.
json.dumps(obj, indent=4)Красивый JSON с отступами.
json.dumps(obj, sort_keys=True)Сортировка ключей словаря по алфавиту.
json.dumps(obj, default=custom)Кодирование неподдерживаемых объектов.
JSONEncoder().encode(obj)Ручная сериализация через класс энкодера.
json.loads(s)Распарсить JSON строку в Python объект.
json.loads(s, object_hook=custom)Кастомная логика десериализации.
JSONDecoder().decode(s)Ручная десериализация через класс декодера.

Python

  1. Освоение типов данных в Python: практическое руководство
  2. Мастерство операторов Python: Полное руководство
  3. Мастерство цикла while в Python: Синтаксис, примеры и лучшие практики
  4. Оператор pass в Python: практическое руководство
  5. Аргументы функций в Python: позиционные, именованные и параметры по умолчанию
  6. Словари в Python: создание, манипуляции и продвинутые техники
  7. Работа с файлами в Python: открытие, чтение, запись и управление
  8. Чтение файлов в Java с BufferedReader — Практическое руководство с примерами
  9. Проверка существования файлов и директорий в Python — практическое руководство
  10. Ввод-вывод файлов в Python: полное руководство по операциям I/O