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-29", "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-29", "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':