json.dumps красиво распечатать в Python

Содержание
Введение
Спецификация
JSON
Словарь
json.dumps + json.loads
Вложенные объекты
Типы данных
Статьи про Python

Введение

Если нужно вывести в консоль словарь или json это можно сделать с помощью json.dumps

Спецификация json.dumps

Если вы хотите сразу же изучить полученный json можно воспользоваться методом dumps()

json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) Serialize obj to a JSON formatted str using this conversion table. The arguments have the same meaning as in dump(). Note Keys in key/value pairs of JSON are always of the type str. When a dictionary is converted into JSON, all the keys of the dictionary are coerced to strings. As a result of this, if a dictionary is converted into JSON and then back into a dictionary, the dictionary may not equal the original one. That is, loads(dumps(x)) != x if x has non-string keys.

JSON

Если нужно распечатать JSON

import json print(json.dumps(response.json(), indent=4))

Словарь

Если нужно распечатать не JSON а словарь, json.dumps нужно использовать так:

import json print(json.dumps(resp.dict, indent=4)) # Если нужно отсортировать словарь print(json.dumps(resp.dict, indent=4, sort_keys=True))

json.dumps + json.loads

Часто приходится использовать связку json.dumps + json.loads

import json response_json = json.loads(response.text) print(json.dumps(response_json, indent=4))

Обратиться ко вложенному объекту

Предположим, приходит следующий json

{ "address": { "version": 1, "date": "2021-Aug-11", "cities": [ { "id": "0", "name": "malaga", "place": { "id": "100", "name": "Форт", "status": "VISITED" } }, { "id": "1", "name": "benalmadena", "place": { "id": "150", "name": "Парк Палома", "status": "VISITED" } } ] } }

Из него нам интересен только статус городов: посещён или не посещён.

Важно понимать, что если у вас есть объет типа dict применять json.dumps() не имеет смысла.

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

data = { "address": { "version": 1, "date": "2024-Mar-28", "cities": [ { "id": "0", "name": "malaga", "place": { "id": "100", "name": "Форт", "status": "VISITED" } }, { "id": "1", "name": "benalmadena", "place": { "id": "150", "name": "Парк Палома", "status": "VISITED" } } ] } }

Можно сразу достать объект из словаря.

cities = data["address"]["cities"] for city in cities: print(city["place"]["status"])

VISITED
VISITED

Если нужно достать статус какого-то определённого места, важно не запутаться где список а где словарь

cities - это список, поэтому там нужно использовать не ключ а индекс, например [0] для Малаги

print(data["address"]["cities"][0]["place"]["status"])

VISITED

json.loads() пригодится если данные приходят в виде str

import json data_set = """{ "address": { "version": 1, "date": "2024-Mar-28", "cities": [ { "id": "0", "name": "malaga", "place": { "id": "100", "name": "Форт", "status": "VISITED" } }, { "id": "1", "name": "benalmadena", "place": { "id": "150", "name": "Парк Палома", "status": "VISITED" } } ] } }""" data_dir = json.loads(data_set) cities = data_dir["address"]["cities"] for city in cities: print(city["place"]["status"])

VISITED
VISITED

Ошибки

TypeError: the JSON object must be str, bytes or bytearray, not dict

Значит, что к объекту применяют неправильный метод. Чтобы понимать какой тип имеют объекты прочитайте следующий параграф.

Типы данных

Коротко:

json.dumps(): dict → str

json.loads(): str → dict

Нужно понимать с какими объектами вы работаете. С этим поможет функция type()

Допустим r = requests.get() тогда r это объект типа

<class 'requests.models.Response'>

Если применить метод json() тогда r.json() станет объектом типа dict

<class 'dict'>

К этому словарю теперь можно применить функцию json.dumps()

json.dumps(r.json()) будет иметь тип строки

<class 'str'>

Обратно в словарь можно переделать объект с помощью json.loads()

json.loads(json.dumps(r.json())) будет иметь тип

<class 'dict'>

Визуально различить эти объекты будет непросто. В PyCharm строка имеет " двойные кавычки

{"count": 6, "items":

А словарь ' одинарные

{'count': 6, 'items':

Похожие статьи
Python
Интерактивный режим
dict, list, str
\: перенос строки
if, elif, else
Циклы
Функции
try except
Пакеты
ООП
Опеределить тип переменной Python
Работа с REST API на Python
Файлы: записать, прочитать…
Работа с базами данных
datetime: Дата и время в Python
Сложности при работе с Python
Фреймворки: Django, Flask
socket: Python Sockets
Виртуальное окружение
subprocess: bash команды из Python
multiprocessing: несколько процессов одновременно
psutil: cистемные ресурсы
sys.argv: аргументы командной строки
PyCharm: IDE
pydantic: валидация данных
paramiko: SSH из Python
logging: запись в лог
Обучение Python

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: