JSON to Python

Generera Python-dataklasser från JSON

Prova ett exempel
Rotklassnamn:

JSON-inmatning

Python-utdata

Körs lokalt · Säkert att klistra in hemligheter
Python-dataklasser visas här…

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.

Omedelbar dataklassgenerering
Klistra in din JSON och få typade Python-dataklassdefinitioner på under en sekund. Nästlade objekt, listor och valfria fält hanteras automatiskt.
🔒
Integritetsfokuserad hantering
Konverteringen körs helt i din webbläsare med JavaScript. Din JSON lämnar aldrig din maskin. API-nycklar, tokens och användarposter förblir privata.
📝
Korrekta typannoteringar
Varje genererat fält inkluderar en Python-typannotering härledd från JSON-värdet: str, int, float, bool, List[T] eller Optional[T] för null-värden.
📦
Inget konto eller installation krävs
Öppna sidan och klistra in din JSON. Ingen Python-miljö krävs, inga pip-paket att installera, inga konton att skapa.

Användningsfall för JSON till Python

Utveckling av REST API-klienter
Generera dataklasser från API-responsexempel. Klistra in JSON som returneras av ett tredjeparts REST-ändpunkt och få typsäkra Python-klasser redo för requests eller httpx.
FastAPI Request/Response-modeller
Börja från en JSON-payload-struktur och generera dataklassdefinitioner. Konvertera dem till Pydantic-modeller för att få automatisk validering i FastAPI-routehanterare.
Scheman för datapipeliner
Definiera typade poststrukturer för ETL-pipeliner. Klistra in ett JSON-exempelmeddelande från Kafka, RabbitMQ eller SQS och generera dataklasser som dokumenterar den förväntade strukturen.
Parsning av konfigurationsfiler
Omvandla JSON-konfigurationsfiler till typade Python-klasser. Läs in din konfiguration med json.load() och konstruera sedan en dataklassinstans för autokompletering och typkontroll i editorn.
Generering av testfixtures
Skapa typade fixtures från JSON-exempeldata. QA-ingenjörer kan klistra in API-responsögonblicksbilder och producera dataklassdefinitioner för pytest-testsviter.
Lär dig Python-typannoteringar
Studenter kan klistra in valfri JSON-struktur och se hur Python representerar den med typledtrådar. Den genererade koden visar List, Optional, nästlade klasser och standardvärden i kontext.

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-typExempelPython (typing)Python 3.10+
string"hello"strstr
number (integer)42intint
number (float)3.14floatfloat
booleantrueboolbool
nullnullOptional[str]str | None
object{"k": "v"}@dataclass classnested 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ältBeteendeAnvänd när
@dataclassGenerates __init__, __repr__, __eq__ from field annotationsStandard 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 accessPython 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 instancesList/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.

@dataclass
Standardbibliotek (Python 3.7+). Genererar __init__, __repr__ och __eq__. Ingen körtidsvalidering. Fungerar med mypy och dataclasses-json för serialisering. Bäst för interna datastrukturer där du kontrollerar indata.
BaseModel (Pydantic)
Tredjepartsbibliotek. Validerar typer och begränsningar vid körtid. Parsar JSON direkt via model_validate_json(). Standardval för FastAPI, inställningshantering och all kod som tar emot opålitlig indata.
TypedDict
Standardbibliotek (Python 3.8+). Lägger till typledtrådar till vanliga dict-objekt. Ingen __init__ eller metoder genereras. Värden förblir tillgängliga som vanlig dict-åtkomst. Använd när du behöver typkontroll men vill behålla dict-gränssnittet, till exempel i äldre kodbaser.

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.

Python (dataclasses)
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')
JavaScript (generate Python from JSON)
// 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]
Python (Pydantic BaseModel alternative)
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
CLI (datamodel-code-generator)
# 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]

Vanliga frågor

Vad är skillnaden mellan en Python-dataklass och en vanlig klass?
En dataklass använder dekoratören @dataclass för att automatiskt generera metoderna __init__, __repr__ och __eq__ från fältannoteringar. En vanlig klass kräver att du skriver dessa metoder själv. Dataklasser minskar kodupprepning när klassen primärt innehåller data, vilket är det typiska fallet för JSON-härledda strukturer.
Kan jag använda dataklasser med JSON-serialisering direkt?
Standardbibliotekets json-modul kan inte serialisera dataklassinstanser som standard. Använd dataclasses.asdict() för att konvertera en dataklass till en dict och skicka sedan det till json.dumps(). För mer kontroll lägger biblioteket dataclasses-json till metoderna .to_json() och .from_json(), och Pydantic-modeller hanterar serialisering inbyggt.
Hur hanterar konverteraren nästlade JSON-objekt?
Varje nästlat objekt blir en separat @dataclass-definition. Om ett JSON-fält med namnet "address" innehåller ett objekt med "street" och "city" skapar konverteraren en Address-dataklass och annoterar föräldrafältet som address: Address. Djupt nästlade strukturer producerar flera dataklassdefinitioner i beroendeordning.
Vad händer när ett JSON-fält är null?
Null-fält annoteras som Optional[str] (eller lämplig typ om den kan härledas från sammanhanget) med standardvärdet None. Fält med standardvärden måste komma efter obligatoriska fält i en dataklass, så konverteraren placerar valfria fält i slutet av klassdefinitionen.
Är det någon skillnad mellan dataklasser och Pydantic-modeller för JSON?
Dataklasser är en del av standardbiblioteket och validerar inte data vid körtid. Pydantic-modeller validerar typer, tillämpar begränsningar och kan parsa råa JSON-strängar direkt. Om du tar emot JSON från externa källor och behöver avvisa felformaterad data passar Pydantic bättre. För intern datadelning där du litar på indata är dataklasser lättare och har inga externa beroenden.
Hur hanterar jag camelCase-JSON-nycklar i Python-dataklasser?
Pythons konvention använder snake_case för variabelnamn. Konverteraren översätter camelCase-nycklar som "firstName" till snake_case-fält som first_name. Om du behöver deserialisera tillbaka från JSON, använd biblioteket dataclasses-json med en konfiguration som mappar mellan de två namnkonventionerna, eller skriv en anpassad __post_init__-metod.
Stöder den här konverteraren Python 3.10+-syntax som list[str] istället för List[str]?
Konverteraren genererar typing-modulimporter (List, Optional) för maximal kompatibilitet med Python 3.7 till 3.12. Om ditt projekt riktar sig mot Python 3.10 eller senare kan du tryggt ersätta List[str] med list[str] och Optional[str] med str | None. Typmappningstabellen ovan visar båda formerna.