JSON to Python
JSON से Python dataclass जनरेट करें
JSON इनपुट
Python आउटपुट
JSON से Python Dataclass रूपांतरण क्या है?
JSON से Python dataclass रूपांतरण एक कच्चे JSON ऑब्जेक्ट को लेकर सटीक टाइप एनोटेशन सहित Python dataclass परिभाषाओं का समूह तैयार करता है। Python का dataclasses मॉड्यूल, जिसे PEP 557 (Python 3.7) में introduce किया गया, एनोटेटेड क्लास फ़ील्ड से __init__, __repr__ और __eq__ मेथड स्वतः जनरेट करता है। जब आप JSON APIs, कॉन्फ़िगरेशन फ़ाइलों या मैसेज क्यूज़ के साथ काम करते हैं, तो dataclass आपके डेटा को एक typed संरचना देते हैं जिसे editor और mypy जैसे type checker development के दौरान verify कर सकते हैं।
Python का json.loads() सामान्य dict और list लौटाता है। ये काम तो करते हैं, लेकिन इनमें कोई टाइप जानकारी नहीं होती: गलत वर्तनी वाली key error throw करने के बजाय None लौटाती है, और editor field name autocomplete नहीं कर सकता। Dataclass इस समस्या को हल करते हैं — प्रत्येक JSON कुंजी को एक नामित, typed फ़ील्ड से मैप करके। नेस्टेड JSON ऑब्जेक्ट अलग-अलग dataclass परिभाषाएँ बन जाते हैं, ऐरे List[T] एनोटेशन बन जाते हैं, और null मान Optional[T] बन जाते हैं जिनका डिफ़ॉल्ट None होता है।
ये परिभाषाएँ हाथ से लिखना एक boring काम है। आपको JSON पढ़ना होता है, प्रत्येक फ़ील्ड का प्रकार उसके मान से निर्धारित करना होता है, camelCase या snake_case कुंजियों को Python परंपराओं के अनुसार बदलना होता है, और nullable फ़ील्ड तथा मिश्रित-प्रकार ऐरे जैसे अपवाद संभालने होते हैं। एक कनवर्टर यह सब कुछ मिलीसेकंड में कर देता है। आप JSON चिपकाएँ, सही dataclass कोड पाएँ और आगे बढ़ें।
JSON to Python कनवर्टर का उपयोग क्यों करें?
JSON संरचनाओं को हाथ से Python क्लास परिभाषाओं में अनुवाद करने का अर्थ है नमूना डेटा से प्रकार अनुमानित करना, फ़ील्ड को इस तरह क्रमबद्ध करना कि आवश्यक फ़ील्ड वैकल्पिक से पहले आएँ, और जब API बदले तो सब कुछ update करना। एक कनवर्टर यह बाधा हटा देता है।
JSON to Python के उपयोग के मामले
JSON से Python टाइप मैपिंग
प्रत्येक JSON मान एक विशिष्ट Python टाइप एनोटेशन से संगत होता है। नीचे दी गई तालिका दर्शाती है कि कनवर्टर प्रत्येक JSON प्रकार को कैसे अनुवाद करता है — typing मॉड्यूल वाक्यरचना (Python 3.7+) और Python 3.10 से उपलब्ध अंतर्निर्मित वाक्यरचना, दोनों के साथ।
| JSON प्रकार | उदाहरण | Python (typing) | Python 3.10+ |
|---|---|---|---|
| string | "hello" | str | str |
| number (integer) | 42 | int | int |
| number (float) | 3.14 | float | float |
| boolean | true | bool | bool |
| null | null | Optional[str] | str | None |
| object | {"k": "v"} | @dataclass class | nested model |
| array of strings | ["a", "b"] | List[str] | list[str] |
| array of objects | [{"id": 1}] | List[Item] | list[Item] |
| mixed array | [1, "a"] | List[Any] | list[Any] |
Dataclass Decorator संदर्भ
@dataclass decorator कई पैरामीटर स्वीकार करता है जो जनरेटेड क्लास के व्यवहार को बदलते हैं। यह संदर्भ उन विकल्पों को कवर करता है जो JSON-व्युत्पन्न डेटा के साथ कार्य करते समय सबसे अधिक प्रासंगिक हैं।
| Decorator / Field | व्यवहार | कब उपयोग करें |
|---|---|---|
| @dataclass | Generates __init__, __repr__, __eq__ from field annotations | Standard dataclasses |
| @dataclass(frozen=True) | Makes instances immutable (hashable, no attribute reassignment) | Config objects, dict keys |
| @dataclass(slots=True) | Uses __slots__ for lower memory and faster attribute access | Python 3.10+, large datasets |
| @dataclass(kw_only=True) | All fields require keyword arguments in __init__ | Python 3.10+, many fields |
| field(default_factory=list) | Sets a mutable default without sharing state between instances | List/dict/set defaults |
dataclass बनाम Pydantic बनाम TypedDict
JSON से typed संरचनाएँ परिभाषित करने के Python में तीन सामान्य तरीके हैं। प्रत्येक अलग उपयोग के मामले के लिए उपयुक्त है। Dataclass बिना किसी निर्भरता वाला मानक लाइब्रेरी विकल्प है। Pydantic रनटाइम सत्यापन जोड़ता है। TypedDict नई क्लास बनाए बिना सामान्य dict को एनोटेट करता है।
कोड उदाहरण
ये उदाहरण दर्शाते हैं कि Python में जनरेटेड dataclass का उपयोग कैसे करें, JavaScript से प्रोग्रामेटिक रूप से कैसे बनाएँ, और Pydantic तथा CLI उपकरणों जैसे वैकल्पिक तरीकों का उपयोग कैसे करें।
from dataclasses import dataclass
from typing import List, Optional
import json
@dataclass
class Address:
street: str
city: str
zip: str
@dataclass
class User:
id: int
name: str
email: str
active: bool
score: float
address: Address
tags: List[str]
metadata: Optional[str] = None
raw = '{"id":1,"name":"Alice","email":"alice@example.com","active":true,"score":98.5,"address":{"street":"123 Main St","city":"Springfield","zip":"12345"},"tags":["admin","user"],"metadata":null}'
data = json.loads(raw)
# Reconstruct nested objects manually
addr = Address(**data["address"])
user = User(**{**data, "address": addr})
print(user.name) # -> Alice
print(user.address) # -> Address(street='123 Main St', city='Springfield', zip='12345')// Minimal JSON-to-Python-dataclass generator in JS
function jsonToPython(obj, name = "Root") {
const classes = [];
function infer(val, fieldName) {
if (val === null) return "Optional[str]";
if (typeof val === "string") return "str";
if (typeof val === "number") return Number.isInteger(val) ? "int" : "float";
if (typeof val === "boolean") return "bool";
if (Array.isArray(val)) {
const first = val.find(v => v !== null);
return first ? `List[${infer(first, fieldName + "Item")}]` : "List[Any]";
}
if (typeof val === "object") {
const clsName = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
build(val, clsName);
return clsName;
}
return "Any";
}
function build(obj, cls) {
const fields = Object.entries(obj).map(([k, v]) => ` ${k}: ${infer(v, k)}`);
classes.push(`@dataclass\nclass ${cls}:\n${fields.join("\n")}`);
}
build(obj, name);
return classes.join("\n\n");
}
const data = { id: 1, name: "Alice", scores: [98, 85] };
console.log(jsonToPython(data, "User"));
// @dataclass
// class User:
// id: int
// name: str
// scores: List[int]from pydantic import BaseModel
from typing import List, Optional
class Address(BaseModel):
street: str
city: str
zip: str
class User(BaseModel):
id: int
name: str
email: str
active: bool
score: float
address: Address
tags: List[str]
metadata: Optional[str] = None
# Pydantic parses and validates JSON in one step
raw = '{"id":1,"name":"Alice","email":"alice@example.com","active":true,"score":98.5,"address":{"street":"123 Main St","city":"Springfield","zip":"12345"},"tags":["admin","user"],"metadata":null}'
user = User.model_validate_json(raw)
print(user.name) # -> Alice
print(user.model_dump_json()) # -> re-serializes to JSON# Install the generator
pip install datamodel-code-generator
# Generate dataclasses from a JSON file
datamodel-codegen --input data.json --output models.py --output-model-type dataclasses.dataclass
# Generate Pydantic models instead
datamodel-codegen --input data.json --output models.py
# From a JSON string via stdin
echo '{"id": 1, "name": "Alice", "tags": ["admin"]}' | \
datamodel-codegen --output-model-type dataclasses.dataclass
# Output:
# @dataclass
# class Model:
# id: int
# name: str
# tags: List[str]