Уроки модуля (1/4)
JSON: сериализация и анализ
JSON — наиболее распространенный формат обмена данными. Модуль json в
стандартная библиотека обрабатывает это изначально.
От Python к JSON: dumps
json.dumps(object) сериализует объект Python в строку JSON.
import json
dati = {"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}
json.dumps(dati)
# '{"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}'
json.dumps(dati, indent=2, sort_keys=True)
# multi-line formatted string, keys sortedИз JSON в Python: loads
json.loads(string) анализирует строку JSON и возвращает объекты Python.
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"] # 'Ada'
type(d) # <class 'dict'>Сопоставление типов
| JSON | Питон |
|---|---|
object | dict |
array | list |
string | str |
number | int / float |
true | True |
false | False |
null | None |
Из файла: dump / load
with open("config.json", "w") as f:
json.dump(dati, f, indent=2)
with open("config.json") as f:
dati = json.load(f)Без завершающей буквы «s» они работают с файлами (подобно файлам), с буквой «s» — со строками.
Несериализуемые типы: default
datetime, set, ваши пользовательские классы по умолчанию не сериализуются:
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializableВы можете передать функцию default, которая расскажет, как их преобразовать:
def converti(obj):
if isinstance(obj, datetime.datetime):
return obj.isoformat()
if isinstance(obj, set):
return list(obj)
raise TypeError(f"non serializzabile: {type(obj)}")
json.dumps({"ora": datetime.datetime.now()}, default=converti)JSON и файловые операции
Стандартная библиотека также предоставляет json.dump() и json.load() (без «s») для записи и чтения данных JSON непосредственно в файлы и из файлов, естественным образом сочетаясь с контекстными менеджерами:
with open("data.json", "w") as f:
json.dump(data, f)Попробуйте это
Учитывая `data = {'nome': 'Ada', 'anni': 36}`, сериализуйте его в JSON с отступом = 2 и присвойте переменной `json_str`. Оцените `json_str`.
Показать подсказку
json.dumps(данные, отступ = 2)
Решение доступно после 3 попыток
Обзор упражнения
Учитывая строку JSON s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]', разберите ее с помощью json.loads на данные и вычислите сумму значений 'v' в целом. Оценить итого.
Показать подсказку
json.loads возвращает список диктовок.
Решение доступно после 3 попыток
Дополнительная задача
Учитывая строку JSON \`json_data = '{"name": "Alice", "age": 30}'\`, декодируйте ее в словарь Python с помощью \`json.loads\`. Извлеките значение, связанное с ключом \`'name'\`, и сохраните его в \`user_name\`. Наконец, оцените \`user_name\`.
Показать подсказку
Используйте json.loads(json_data) для декодирования, а затем получите доступ через data['name'].
Решение доступно после 3 попыток