JSON থেকে Python
JSON থেকে Python dataclass তৈরি করুন
JSON ইনপুট
Python আউটপুট
JSON থেকে Python Dataclass রূপান্তর কী?
JSON থেকে Python dataclass রূপান্তর একটি কাঁচা JSON অবজেক্ট নিয়ে সঠিক type annotation সহ Python dataclass সংজ্ঞার একটি সেট তৈরি করে। Python-এর dataclasses মডিউল, PEP 557 (Python 3.7)-এ প্রবর্তিত, annotated ক্লাস ফিল্ড থেকে __init__, __repr__ এবং __eq__ মেথড তৈরি করে। JSON API, কনফিগারেশন ফাইল বা মেসেজ কিউ-এর সাথে কাজ করার সময়, dataclass আপনার ডেটাকে একটি টাইপড কাঠামো দেয় যা mypy-এর মতো এডিটর ও টাইপ চেকার ডেভেলপমেন্টের সময় যাচাই করতে পারে।
Python-এর json.loads() সাধারণ dict ও list রিটার্ন করে। এগুলো কাজ করে, কিন্তু এতে কোনো টাইপ তথ্য নেই: ভুল key দিলেও error না তুলে None রিটার্ন করে, এবং আপনার এডিটর ফিল্ডের নাম অটোকমপ্লিট করতে পারে না। Dataclass প্রতিটি JSON কী-কে একটি নামযুক্ত, টাইপড ফিল্ডে ম্যাপ করে এই সমস্যা সমাধান করে। নেস্টেড JSON অবজেক্ট আলাদা dataclass সংজ্ঞায় পরিণত হয়, অ্যারে List[T] annotation হয়, এবং null মান None ডিফল্ট সহ Optional[T] হয়।
হাতে এই সংজ্ঞাগুলো লেখা যান্ত্রিক কাজ। JSON পড়তে হয়, প্রতিটি ফিল্ডের মান থেকে টাইপ বের করতে হয়, camelCase বা snake_case থেকে Python কনভেনশনে কী রূপান্তর করতে হয়, এবং nullable ফিল্ড ও মিশ্র-টাইপ অ্যারের মতো বিশেষ ক্ষেত্র সামলাতে হয়। একটি কনভার্টার এই সব কাজ মিলিসেকেন্ডে করে দেয়। JSON পেস্ট করুন, সঠিক dataclass কোড পান, এবং এগিয়ে যান।
JSON থেকে Python কনভার্টার কেন ব্যবহার করবেন?
হাতে JSON কাঠামোকে Python ক্লাস সংজ্ঞায় রূপান্তর করার অর্থ হলো নমুনা ডেটা থেকে টাইপ অনুমান করা, required ফিল্ডগুলো optional-এর আগে আসে তা নিশ্চিত করতে ফিল্ড পুনর্বিন্যাস করা, এবং API পরিবর্তিত হলে সব আপডেট করা। একটি কনভার্টার এই ঝামেলা দূর করে।
JSON থেকে Python ব্যবহারের ক্ষেত্র
JSON থেকে Python টাইপ ম্যাপিং
প্রতিটি JSON মান একটি নির্দিষ্ট Python type annotation-এ ম্যাপ হয়। নিচের সারণিতে কনভার্টার প্রতিটি JSON টাইপ কীভাবে অনুবাদ করে তা দেখানো হয়েছে — typing মডিউল সিনট্যাক্স (Python 3.7+) এবং Python 3.10 থেকে পাওয়া built-in সিনট্যাক্স উভয়সহ।
| 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 থেকে টাইপড কাঠামো সংজ্ঞায়িত করতে Python-এর তিনটি সাধারণ উপায় আছে। প্রতিটি ভিন্ন ব্যবহারের ক্ষেত্রে উপযুক্ত। Dataclass হলো শূন্য নির্ভরতা সহ স্ট্যান্ডার্ড লাইব্রেরির বিকল্প। Pydantic রানটাইম যাচাইকরণ যোগ করে। TypedDict নতুন ক্লাস না তৈরি করেই সাধারণ dict-এ annotation যোগ করে।
কোড উদাহরণ
এই উদাহরণগুলো 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]