JSON to Python
Generera Python-dataklasser från JSON
JSON-inmatning
Python-utdata
Vad är JSON till Python-dataklasskonvertering?
JSON till Python-dataklasskonvertering tar ett råformat JSON-objekt och producerar en uppsättning Python-dataklassdefinitioner med korrekta typannoteringar. Pythons dataclasses-modul, introducerad i PEP 557 (Python 3.7), genererar metoderna __init__, __repr__ och __eq__ från annoterade klassfält. När du arbetar med JSON-API:er, konfigurationsfiler eller meddelandeköer ger dataklasser din data en typad struktur som editorer och typkontrollanter som mypy kan verifiera under utvecklingstid.
Pythons json.loads() returnerar vanliga dict- och list-objekt. Dessa fungerar, men de saknar typinformation: en felstavad nyckel returnerar None istället för att kasta ett fel, och din editor kan inte autokomplettera fältnamn. Dataklasser löser detta genom att mappa varje JSON-nyckel till ett namngivet, typad fält. Nästlade JSON-objekt blir separata dataklassdefinitioner, arrayer blir List[T]-annoteringar och null-värden blir Optional[T] med standardvärdet None.
Att skriva dessa definitioner för hand är mekaniskt arbete. Du läser JSON, räknar ut varje fälts typ från dess värde, konverterar nycklar från camelCase eller snake_case till Pythons konventioner och hanterar specialfall som nullbara fält och arrayer med blandade typer. Ett konverteringsverktyg gör allt detta på millisekunder. Du klistrar in JSON, får korrekt dataklassikod och kan fortsätta.
Varför använda en JSON till Python-konverterare?
Att översätta JSON-strukturer till Python-klassdefinitioner för hand innebär att gissa typer från exempeldata, ordna om fält så att obligatoriska fält kommer före valfria, och uppdatera allt när API:et ändras. En konverterare tar bort det gnidandet.
Användningsfall för JSON till Python
Typmappning från JSON till Python
Varje JSON-värde mappas till en specifik Python-typannotering. Tabellen nedan visar hur konverteraren översätter varje JSON-typ, med både typing-modulsyntaxen (Python 3.7+) och den inbyggda syntaxen tillgänglig från Python 3.10 och framåt.
| JSON-typ | Exempel | 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] |
Referens för dataclass-dekoratören
Dekoratören @dataclass accepterar flera parametrar som ändrar hur den genererade klassen beter sig. Den här referensen täcker alternativen som är mest relevanta när man arbetar med JSON-härledd data.
| Dekoratör / Fält | Beteende | Använd nä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 vs Pydantic vs TypedDict
Python har tre vanliga sätt att definiera typade strukturer från JSON. Vart och ett passar ett annat användningsfall. Dataklasser är standardbiblioteksalternativet utan externa beroenden. Pydantic lägger till körtidsvalidering. TypedDict annoterar vanliga dict-objekt utan att skapa en ny klass.
Kodexempel
Dessa exempel visar hur man använder genererade dataklasser i Python, hur man producerar dem programmatiskt från JavaScript och hur man använder alternativa metoder som Pydantic och CLI-verktyg.
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]