from dataclasses import dataclass, asdict import json from typing import Optional @dataclass class User: name: str email: str age: Optional[int] = None def to_json(self) -> str: return json.dumps(asdict(self), indent=2) @classmethod def from_json(cls, data: str) -> "User": return cls(**json.loads(data)) # Usage user = User(name="Alice", email="alice@example.com", age=30) print(user.to_json()) restored = User.from_json(user.to_json())