Skip to content

Instantly share code, notes, and snippets.

@runningzyp
Created May 21, 2024 05:23
Show Gist options
  • Save runningzyp/ebe8b174fc8489fb8ec6b3d610d448f6 to your computer and use it in GitHub Desktop.
Save runningzyp/ebe8b174fc8489fb8ec6b3d610d448f6 to your computer and use it in GitHub Desktop.
generate dataclasses
def parse_json(data: Any, class_name: str) -> str:
if isinstance(data, dict):
fields = []
nested_classes = []
for key, value in data.items():
field_type, nested_class = parse_json(value, key.capitalize())
fields.append(f"{key}: {field_type}")
if nested_class:
nested_classes.append(nested_class)
class_definition = f"@dataclass\nclass {class_name}:\n " + "\n ".join(fields) + "\n"
return class_name, class_definition + "\n".join(nested_classes)
elif isinstance(data, list):
if data:
# Assuming all elements in the list are of the same type
element_type, nested_class = parse_json(data[0], class_name)
return f"List[{element_type}]", nested_class
else:
return "List[Any]", None
else:
return type(data).__name__, None
def generate_dataclass_code(d: dict, root_class_name: str = "Root") -> str:
_, class_code = parse_json(data, root_class_name)
return "from dataclasses import dataclass\nfrom typing import List, Any\n\n" + class_code
with open(Path(__file__).with_name(RESULT_FILE)) as f:
data = json.load(f)
dataclass_code = generate_dataclass_code(data)
print(dataclass_code)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment