Lewati ke konten
🛠️ToolsShed

JSON to Rust Struct

Konversi objek JSON ke definisi struct Rust dengan macro serde derive.

Tentang alat ini

JSON to Rust Struct adalah alat pembuat kode yang secara otomatis mengonversi data JSON menjadi definisi struct Rust yang sangat tipe. Karena Rust memerlukan deklarasi tipe yang eksplisit, menulis struct secara manual dari JSON dapat membosankan dan rentan kesalahan, terutama untuk objek besar atau bersarang dalam. Alat ini menghilangkan pekerjaan berulang tersebut dengan menganalisis struktur JSON dan menghasilkan kode struct dengan makro derivasi serde untuk serialisasi dan deserialisasi yang mulus.

Cukup tempel data JSON Anda ke dalam bidang input, dan alat akan langsung menghasilkan kode struct Rust yang siap digunakan di proyek Anda. Struct yang dihasilkan menyertakan anotasi serde standar, menjadikannya kompatibel dengan perpustakaan Rust populer seperti serde_json. Ini sangat berguna saat bekerja dengan API eksternal, file konfigurasi, atau data berbasis JSON apa pun yang perlu diurai menjadi Rust.

Alat ini menangani bidang opsional dan objek bersarang secara cerdas, mengurangi penyesuaian manual yang diperlukan sebelum kode dikompilasi. Baik Anda membuat layanan web, alat CLI, atau mengintegrasikan API REST, konverter ini menghemat waktu dan membantu mempertahankan keamanan tipe di seluruh basis kode Rust Anda.

Pertanyaan yang Sering Diajukan

Implementasi Kode

import json
from typing import Any

def to_pascal_case(s: str) -> str:
    return ''.join(word.capitalize() for word in s.replace('-', '_').split('_'))

def to_snake_case(s: str) -> str:
    import re
    s = re.sub(r'([A-Z]+)([A-Z][a-z])', r'\1_\2', s)
    s = re.sub(r'([a-z\d])([A-Z])', r'\1_\2', s)
    return s.lower().replace('-', '_')

def infer_type(value: Any, key: str, structs: dict) -> str:
    if value is None:
        return 'Option<serde_json::Value>'
    elif isinstance(value, bool):
        return 'bool'
    elif isinstance(value, int):
        return 'i64'
    elif isinstance(value, float):
        return 'f64'
    elif isinstance(value, str):
        return 'String'
    elif isinstance(value, list):
        if not value:
            return 'Vec<serde_json::Value>'
        return f'Vec<{infer_type(value[0], key, structs)}>'
    elif isinstance(value, dict):
        struct_name = to_pascal_case(key)
        collect_structs(value, struct_name, structs)
        return struct_name
    return 'serde_json::Value'

def collect_structs(obj: dict, name: str, structs: dict):
    fields = []
    for k, v in obj.items():
        snake = to_snake_case(k)
        rust_type = infer_type(v, k, structs)
        if snake != k:
            fields.append(f'    #[serde(rename = "{k}")]')
        fields.append(f'    pub {snake}: {rust_type},')
    structs[name] = fields

def json_to_rust(json_str: str, root_name: str = 'Root') -> str:
    data = json.loads(json_str)
    structs = {}
    collect_structs(data, root_name, structs)
    lines = []
    for name, fields in structs.items():
        lines.append('#[derive(Debug, Serialize, Deserialize)]')
        lines.append(f'pub struct {name} {{')
        lines.extend(fields)
        lines.append('}')
        lines.append('')
    return '\n'.join(lines)

json_input = '{"name": "Alice", "age": 30, "active": true}'
print(json_to_rust(json_input))

Comments & Feedback

Comments are powered by Giscus. Sign in with GitHub to leave a comment.