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 |
РЕКЛАМА от Яндекса. Может быть недоступна в вашем регионе
Конец рекламы. Если там пусто считайте это рекламой моей телеги