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": "2023-Dec-07",
"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": "2023-Dec-07",
"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':