Как преобразовать json в мой тип и обратно в Python?
Коллеги, я раньше не трогал Python, работал в .net, так что для меня тут многие вещи непонятны. Например, учитывая, что Python используется для создания веб серверов и имеет безграничный комьюнити, я ожидал, что гугль вернет мне четкий отработанный вариант, как десериализовать JSON в мой тип, который имеет глубокую вложенность, массивы и Enum, которые приходят в виде строк. Но все, что мне удалось найти - рекомендации по полуручному парсингу.
Поэтому, у меня большая просьба, скажите, как мне десериализовать входящий JSON в объекты моих типов
class MyEnum(Enum):
VAR1 = 'var1'
CAMEL_CASE_VAR = 'camelCaseVar'
class Nested(object):
prop_str: str
prop_int: int
prop_bool: bool
class MyClass(object):
prop_list: List[Nested]
prop_enum: MyEnum
А вот json
{
"propList": [
{
"propStr": "str",
"propInt": 5,
"propBool": False
}
],
"propEnum": "camelCase"
}
Ответы (2 шт):
Поэтому, у меня большая просьба, скажите, как мне десериализовать входящий JSON в объекты моих типов
Просто цитата из доки:
import json
json.dump(obj, fp, *, 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 as a JSON formatted stream to fp (a .write()-supporting file-like object) using this conversion table.
import json
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
Deserialize fp (a .read()-supporting text file or binary file containing a JSON document) to a Python object using this conversion table.
Дополняю свой ответ:
вам не составит труда написать сериализацию/десериализацию для моего примера.
import json
# Открываем файл для записи JSON дампа
fp = open('tempfile.json', mode='w');
# Объект, который мы будем записывать
obj = {
"propList": [
{
"propStr": "str",
"propInt": 5,
"propBool": False
}
],
"propEnum": "camelCase"
}
# Сермализуем объект в JSON формате
json.dump(obj, fp)
# Закрываем файл и делаем контрольное чтение
fp.close()
fp = open('tempfile.json', mode='r');
# Десериализуем из формата JSON
obj_new = json.load(fp)
print(obj_new)
from dataclasses import dataclass
from enum import Enum
from typing import List
from pydantic import BaseModel
class MyEnum(Enum):
VAR1 = 'var1'
CAMEL_CASE_VAR = 'camelCaseVar'
@dataclass
class Nested:
prop_str: str
prop_int: int
prop_bool: bool
class MyClass(BaseModel):
prop_list: List[Nested]
prop_enum: MyEnum
json_data = {
"propList": [
{
"propStr": "str",
"propInt": 5,
"propBool": False
}
],
"propEnum": "camelCaseVar"
}
# Десериализация JSON в объект типа MyClass
my_obj = MyClass.model_validate_json(json_data)