JSON to Python

Buat Python dataclass dari JSON

Coba contoh
Nama root class:

Input JSON

Output Python

Berjalan lokal ยท Aman untuk menempel rahasia
Python dataclass akan muncul di siniโ€ฆ

Apa Itu Konversi JSON ke Python Dataclass?

Konversi JSON ke Python dataclass mengambil objek JSON mentah dan menghasilkan sekumpulan definisi Python dataclass dengan anotasi tipe yang akurat. Modul dataclasses Python, yang diperkenalkan dalam PEP 557 (Python 3.7), menghasilkan metode __init__, __repr__, dan __eq__ secara otomatis dari field class yang dianotasi. Saat Anda bekerja dengan API JSON, file konfigurasi, atau antrean pesan, dataclass memberikan struktur bertipe pada data Anda yang dapat diverifikasi oleh editor dan pemeriksa tipe seperti mypy pada saat pengembangan.

Fungsi json.loads() Python mengembalikan dict dan list biasa. Ini memang berfungsi, tetapi tidak memiliki informasi tipe: kunci yang salah eja mengembalikan None alih-alih memunculkan error, dan editor Anda tidak dapat melengkapi nama field secara otomatis. Dataclass menyelesaikan masalah ini dengan memetakan setiap kunci JSON ke field bernama dan bertipe. Objek JSON bersarang menjadi definisi dataclass terpisah, array menjadi anotasi List[T], dan nilai null menjadi Optional[T] dengan nilai default None.

Menulis definisi ini secara manual adalah pekerjaan yang mekanis. Anda membaca JSON, menentukan tipe setiap field dari nilainya, mengonversi kunci dari camelCase atau snake_case ke konvensi Python, dan menangani kasus khusus seperti field nullable dan array dengan tipe campuran. Sebuah konverter melakukan semua ini dalam hitungan milidetik. Anda menempelkan JSON, mendapatkan kode dataclass yang benar, dan bisa langsung melanjutkan.

Mengapa Menggunakan Konverter JSON ke Python?

Menerjemahkan struktur JSON ke definisi class Python secara manual berarti menebak tipe dari data sampel, mengurutkan ulang field agar yang wajib ada sebelum yang opsional, dan memperbarui semuanya saat API berubah. Sebuah konverter menghilangkan gesekan tersebut.

โšก
Pembuatan dataclass secara instan
Tempelkan JSON Anda dan dapatkan definisi Python dataclass bertipe dalam kurang dari satu detik. Objek bersarang, list, dan field opsional ditangani secara otomatis.
๐Ÿ”’
Pemrosesan yang mengutamakan privasi
Konversi berjalan sepenuhnya di browser Anda menggunakan JavaScript. JSON Anda tidak pernah meninggalkan perangkat Anda. Kunci API, token, dan data pengguna tetap bersifat pribadi.
๐Ÿ“
Anotasi tipe yang akurat
Setiap field yang dihasilkan menyertakan anotasi tipe Python yang disimpulkan dari nilai JSON: str, int, float, bool, List[T], atau Optional[T] untuk nilai null.
๐Ÿ“ฆ
Tanpa instalasi atau pendaftaran
Buka halaman dan tempelkan JSON Anda. Tidak perlu lingkungan Python, tidak ada paket pip yang perlu diinstal, tidak ada akun yang perlu dibuat.

Kasus Penggunaan JSON ke Python

Pengembangan Klien REST API
Buat dataclass dari sampel respons API. Tempelkan JSON yang dikembalikan oleh endpoint REST pihak ketiga dan dapatkan class Python bertipe yang siap digunakan dengan requests atau httpx.
Model Request/Response FastAPI
Mulai dari bentuk payload JSON dan hasilkan definisi dataclass. Konversikan ke model Pydantic untuk mendapatkan validasi otomatis di route handler FastAPI.
Skema Pipeline Data
Definisikan struktur record bertipe untuk pipeline ETL. Tempelkan sampel pesan JSON dari Kafka, RabbitMQ, atau SQS dan hasilkan dataclass yang mendokumentasikan bentuk data yang diharapkan.
Parsing File Konfigurasi
Ubah file konfigurasi JSON menjadi class Python bertipe. Muat konfigurasi Anda dengan json.load(), lalu buat instance dataclass untuk pelengkapan otomatis editor dan pemeriksaan tipe.
Pembuatan Fixture Pengujian
Buat fixture bertipe dari data JSON sampel. Engineer QA dapat menempelkan snapshot respons API dan menghasilkan definisi dataclass untuk digunakan dalam test suite pytest.
Belajar Anotasi Tipe Python
Mahasiswa dapat menempelkan struktur JSON apa pun dan melihat bagaimana Python merepresentasikannya dengan type hint. Kode yang dihasilkan menunjukkan List, Optional, class bersarang, dan nilai default dalam konteks nyata.

Pemetaan Tipe JSON ke Python

Setiap nilai JSON dipetakan ke anotasi tipe Python yang spesifik. Tabel di bawah menunjukkan cara konverter menerjemahkan setiap tipe JSON, dengan sintaks modul typing (Python 3.7+) dan sintaks bawaan yang tersedia mulai Python 3.10.

Tipe JSONContohPython (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]

Referensi Decorator Dataclass

Decorator @dataclass menerima beberapa parameter yang mengubah perilaku class yang dihasilkan. Referensi ini mencakup opsi yang paling relevan saat bekerja dengan data yang berasal dari JSON.

Decorator / FieldPerilakuGunakan Saat
@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 memiliki tiga cara umum untuk mendefinisikan struktur bertipe dari JSON. Masing-masing cocok untuk kasus penggunaan yang berbeda. Dataclass adalah opsi dari library standar tanpa dependensi eksternal. Pydantic menambahkan validasi saat runtime. TypedDict menganotasi dict biasa tanpa membuat class baru.

@dataclass
Library standar (Python 3.7+). Menghasilkan __init__, __repr__, dan __eq__. Tanpa validasi saat runtime. Berfungsi dengan mypy dan dataclasses-json untuk serialisasi. Terbaik untuk struktur data internal di mana Anda mengendalikan input.
BaseModel (Pydantic)
Library pihak ketiga. Memvalidasi tipe dan constraint saat runtime. Mengurai JSON langsung melalui model_validate_json(). Pilihan standar untuk FastAPI, manajemen pengaturan, dan kode apa pun yang menerima input yang tidak tepercaya.
TypedDict
Library standar (Python 3.8+). Menambahkan type hint ke dict biasa. Tidak menghasilkan __init__ atau metode lain. Nilai tetap diakses sebagai dict biasa. Gunakan saat Anda membutuhkan pemeriksaan tipe tetapi ingin mempertahankan antarmuka dict, misalnya dalam codebase lama.

Contoh Kode

Contoh-contoh ini menunjukkan cara menggunakan dataclass yang dihasilkan dalam Python, cara membuatnya secara programatik dari JavaScript, dan cara menggunakan pendekatan alternatif seperti Pydantic dan alat CLI.

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]

Pertanyaan yang Sering Diajukan

Apa perbedaan antara Python dataclass dan class biasa?
Dataclass menggunakan decorator @dataclass untuk menghasilkan metode __init__, __repr__, dan __eq__ secara otomatis dari anotasi field. Class biasa mengharuskan Anda menulis metode-metode ini sendiri. Dataclass mengurangi boilerplate ketika class terutama menyimpan data, yang merupakan kasus umum untuk struktur yang berasal dari JSON.
Bisakah saya menggunakan dataclass dengan serialisasi JSON secara langsung?
Modul json dari library standar tidak dapat melakukan serialisasi instance dataclass secara default. Gunakan dataclasses.asdict() untuk mengonversi dataclass ke dict, lalu teruskan ke json.dumps(). Untuk kontrol lebih besar, library dataclasses-json menambahkan metode .to_json() dan .from_json(), dan model Pydantic menangani serialisasi secara native.
Bagaimana konverter menangani objek JSON bersarang?
Setiap objek bersarang menjadi definisi @dataclass terpisah. Jika field JSON bernama "address" berisi objek dengan "street" dan "city", konverter membuat dataclass Address dan menganotasi field induknya sebagai address: Address. Struktur yang sangat bersarang menghasilkan beberapa definisi dataclass dalam urutan dependensi.
Apa yang terjadi ketika field JSON bernilai null?
Field null dianotasi sebagai Optional[str] (atau tipe yang sesuai jika dapat disimpulkan dari konteks) dengan nilai default None. Field dengan nilai default harus berada setelah field wajib dalam dataclass, sehingga konverter menempatkan field opsional di akhir definisi class.
Apakah ada perbedaan antara dataclass dan model Pydantic untuk JSON?
Dataclass adalah bagian dari library standar dan tidak memvalidasi data saat runtime. Model Pydantic memvalidasi tipe, menerapkan constraint, dan dapat mengurai string JSON mentah secara langsung. Jika Anda menerima JSON dari sumber eksternal dan perlu menolak data yang tidak valid, Pydantic adalah pilihan yang lebih baik. Untuk penerusan data internal di mana Anda memercayai input, dataclass lebih ringan dan tidak memiliki dependensi eksternal.
Bagaimana cara menangani kunci JSON camelCase dalam Python dataclass?
Konvensi Python menggunakan snake_case untuk nama variabel. Konverter menerjemahkan kunci camelCase seperti "firstName" ke field snake_case seperti first_name. Jika Anda perlu melakukan deserialisasi kembali dari JSON, gunakan library dataclasses-json dengan konfigurasi yang memetakan antara kedua konvensi penamaan, atau tulis metode __post_init__ kustom.
Apakah konverter ini mendukung sintaks Python 3.10+ seperti list[str] alih-alih List[str]?
Konverter menghasilkan impor modul typing (List, Optional) untuk kompatibilitas maksimal dengan Python 3.7 hingga 3.12. Jika proyek Anda menargetkan Python 3.10 atau yang lebih baru, Anda dapat dengan aman mengganti List[str] dengan list[str] dan Optional[str] dengan str | None. Tabel pemetaan tipe di atas menunjukkan kedua bentuk tersebut.