Как преобразовать 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 шт):

Автор решения: Sergey

Поэтому, у меня большая просьба, скажите, как мне десериализовать входящий 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)
→ Ссылка
Автор решения: Jiraf322
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)
→ Ссылка