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

Содержание
Введение
JSON из requests
Словарь
json.dumps + json.loads
Вложенные объекты
Типы данных
Применение json.dumps() к строке
Статьи про Python

Введение

json.dumps() конвертирует объект, обычно словарь , в строку .

Если нужно вывести в консоль словарь или json это можно сделать с помощью 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 из requests

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

print(response.json())

Кавычки будут одинарными, булевы переменные будут с заглавной буквы, вместо null будет None и т.д.

json.dumps() позволяет переформатировать этот 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() рассмотрим их совместную работу.

Преобразуем словарь в строку формата JSON а затем эту строку обратно в словарь.

import json sites = { "url": "heihei.ru", "awards": None, "verified": True } # 1 print(sites) # 2 dumped = json.dumps(sites) print(dumped) # 3 loaded = json.loads(dumped) print(loaded)

{'url': 'heihei.ru', 'awards': None, 'verified': True} {"url": "heihei.ru", "awards": null, "verified": true} {'url': 'heihei.ru', 'awards': None, 'verified': True}

# 1
Обычный питоновский словарь выглядит так

{'url': 'heihei.ru', 'awards': None, 'verified': True}

# 2
json.dumps() переделывает его в JSON формат. В JSON кавычки должны быть двойными. True/False должно быть заменено на true/false, None должен быть заменён на null и так далее.

{"url": "heihei.ru", "awards": null, "verified": true}

# 3
json.loads() возвращает словарь из JSON в питоновский вид

{'url': 'heihei.ru', 'awards': None, 'verified': True}

Преобразовать можно и из формата bytes. В этом примере порядок обратный: сначала мы JSON превращаем в словарь Python затем словарь в строку формата JSON.

Тип данных меняется с bytes на dict и затем на str .

import json value=b'{"a": true, "b":2, "c": null}' # 1 print(value) # 2 loaded = json.loads(value.decode('UTF-8')) print(loaded) # 3 dumped = json.dumps(loaded) print(dumped)

b'{"a": true, "b":2, "c": null}' {'a': True, 'b': 2, 'c': None} {"a": true, "b": 2, "c": null}

Ещё раз обращаю внимание на кавычки: в JSON они должны быть двойными.

true в JSON превращается в True в Python

null в JSON превращается в None в Python

Пример совместоного использования json.dumps() и json.loads() при работе с requests

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": "2026-Apr-19", "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": "2026-Apr-19", "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':

Применение json.dumps() к строке

Если случайно или целенаправленно применить jsom.dumps() к строке то нужно учитывать ряд особенностей работы dumps()

Рассмотрим строки s1 и s2 уже знакомые нам по статье «JSON в Python»

Напомню, что s1 это строка, которую можно конвертировать в json словарь с помощью json.loads().

import json s1 = '{"a": 1, "b":2}' s2 = "{'a': 1, 'b':2}" print(f"len(s1): {len(s1)}\nlen(s2): {len(s2)}")

len(s1): 15 len(s2): 15

Как видим длины строк одинаковые

json.dumps() возвращает в обоих случаях строки, то есть не меняет тип. Но длины строк будут отличаться как от оригинальной строки так и друг от друга.

s1_dumps = json.dumps(s1) s2_dumps = json.dumps(s2) print(f"len(s1_dumps): {len(s1_dumps)}") print(f"len(s2_dumps): {len(s2_dumps)}") print(s1_dumps) print(s2_dumps)

len(s1_dumps): 21 len(s2_dumps): 17 "{\"a\": 1, \"b\":2}" "{'a': 1, 'b':2}"

Дамп s2 на два символа длиннее оригинальной строки, так как теперь в строку включены дополнительные кавычки.

Как видим, длина дампа s1 ещё выше, так как помимо дополнительных кавычек в начале и конце экранируются все внутренние двойные кавычки.

Выведем содержимое новых строк посимвольно

print("s1_dumps symbols") for char in s1_dumps: print(char) print("s2_dumps symbols") for char in s2_dumps: print(char)

s1_dumps symbols " { \ " a \ " : 1 , \ " b \ " : 2 } " s2_dumps symbols " { ' a ' : 1 , ' b ' : 2 } "

Каждый следующий дамп увеличивает длину возвращаемой строки за счёт дополнительного экранирования

s1_dumps_dumps = json.dumps(s1_dumps) s2_dumps_dumps = json.dumps(s2_dumps) print(f"len(s1_dumps_dumps): {len(s1_dumps_dumps)}") print(f"len(s2_dumps_dumps): {len(s2_dumps_dumps)}") print(f"s1_dumps_dumps: {s1_dumps_dumps}") print(f"s2_dumps_dumps: {s2_dumps_dumps}")

len(s1_dumps_dumps): 33 len(s2_dumps_dumps): 21 s1_dumps_dumps: "\"{\\"a\\": 1, \\"b\\":2}\"" s2_dumps_dumps: "\"{'a': 1, 'b':2}\""

Автор статьи: Андрей Олегович

Похожие статьи
JSON
Python
dict, list, str
Работа с REST API на Python
Файлы: записать, прочитать…
Обучение Python

РЕКЛАМА от Яндекса. Может быть недоступна в вашем регионе

Конец рекламы. Если там пусто считайте это рекламой моей телеги

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

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

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

@aofeed

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

@aofeedchat

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