JSON'dan Python'a
JSON'dan Python dataclass'ları oluşturun
JSON Girişi
Python Çıktısı
JSON'dan Python Dataclass Dönüşümü Nedir?
JSON'dan Python dataclass dönüşümü, ham bir JSON nesnesini alır ve doğru tür açıklamalarıyla birlikte bir dizi Python dataclass tanımı üretir. PEP 557 (Python 3.7) ile sunulan Python'un dataclasses modülü, açıklamalı sınıf alanlarından __init__, __repr__ ve __eq__ metotlarını otomatik olarak oluşturur. JSON API'leri, yapılandırma dosyaları veya mesaj kuyrukları ile çalışırken dataclass'lar, verilerinize mypy gibi editörler ve tür denetleyicilerinin geliştirme zamanında doğrulayabileceği türlendirilmiş bir yapı kazandırır.
Python'un json.loads() fonksiyonu düz dict ve listeler döndürür. Bunlar çalışır, ancak tür bilgisi içermez: yanlış yazılmış bir anahtar hata fırlatmak yerine None döndürür ve editörünüz alan adlarını otomatik tamamlayamaz. Dataclass'lar, her JSON anahtarını adlandırılmış ve türlendirilmiş bir alana eşleyerek bu sorunu çözer. İç içe JSON nesneleri ayrı dataclass tanımlarına, diziler List[T] açıklamalarına, null değerler ise varsayılan değeri None olan Optional[T] türüne dönüşür.
Bu tanımları elle yazmak mekanik bir iştir. JSON'u okur, her alanın türünü değerinden çıkarsar, anahtarları camelCase ya da snake_case'den Python kurallarına dönüştürür ve null olabilir alanlar ile karma türlü diziler gibi uç durumları ele alırsınız. Bir dönüştürücü tüm bunları milisaniyeler içinde yapar. JSON yapıştırırsınız, doğru dataclass kodunu alırsınız ve işinize devam edersiniz.
Neden JSON'dan Python Dönüştürücü Kullanmalısınız?
JSON yapılarını elle Python sınıf tanımlarına çevirmek; örnek veriden türleri tahmin etmeyi, opsiyonel olanlardan önce zorunlu alanları sıralamayı ve API değiştiğinde her şeyi güncellemeyi gerektirir. Bir dönüştürücü bu zorluğu ortadan kaldırır.
JSON'dan Python'a Kullanım Senaryoları
JSON'dan Python'a Tür Eşleme
Her JSON değeri belirli bir Python tür açıklamasına eşlenir. Aşağıdaki tablo, dönüştürücünün her JSON türünü nasıl çevirdiğini gösterir; hem typing modülü söz dizimi (Python 3.7+) hem de Python 3.10'dan itibaren kullanılabilen yerleşik söz dizimi verilmiştir.
| JSON Türü | Örnek | 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 Dekoratör Başvurusu
@dataclass dekoratörü, üretilen sınıfın davranışını değiştiren çeşitli parametreler kabul eder. Bu başvuru, JSON'dan türetilen verilerle çalışırken en sık kullanılan seçenekleri kapsar.
| Dekoratör / Alan | Davranış | Ne Zaman Kullanılır |
|---|---|---|
| @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 ve TypedDict Karşılaştırması
Python'un JSON'dan türlendirilmiş yapılar tanımlamak için üç yaygın yolu vardır. Her biri farklı bir kullanım senaryosuna uygundur. Dataclass'lar bağımlılığı olmayan standart kütüphane seçeneğidir. Pydantic çalışma zamanı doğrulaması ekler. TypedDict, yeni bir sınıf oluşturmadan düz dict'lere açıklama ekler.
Kod Örnekleri
Bu örnekler, üretilen dataclass'ların Python'da nasıl kullanılacağını, JavaScript'ten programlı olarak nasıl üretileceğini ve Pydantic ile CLI araçları gibi alternatif yaklaşımların nasıl kullanılacağını gösterir.
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]