İçeriğe geç
🛠️ToolsShed

JSON to Rust Struct

JSON nesnelerini serde derive makrolarına sahip Rust yapı tanımlarına dönüştürün.

Bu araç hakkında

JSON to Rust Struct, JSON verilerini güçlü bir şekilde yazılı Rust struct tanımlarına otomatik olarak dönüştüren bir kod oluşturma aracıdır. Rust açık tür bildirimlerini gerektirdiğinden, JSON'dan struct'ları elle yazmak, özellikle büyük veya derin iç içe nesneler için yorucu ve hatalara açık olabilir. Bu araç, JSON yapısını analiz ederek ve serde türetme makroları içeren struct kodu oluşturarak bu tekrarlı işi ortadan kaldırır.

JSON verilerinizi giriş alanına yapıştırmanız yeterlidir ve araç anında projenizde kullanılmaya hazır Rust struct kodu oluşturur. Oluşturulan struct'lar standart serde ek açıklamalarını içerir ve serde_json gibi popüler Rust kütüphaneleriyle uyumludur. Bu, harici API'ler, yapılandırma dosyaları veya Rust'ta ayrıştırılması gereken JSON tabanlı verilerle çalışırken özellikle yararlıdır.

Araç, isteğe bağlı alanları ve iç içe nesneleri akıllıca ele alarak, kod derlenmeden önce gerekli el ile yapılan ayarlamaları azaltır. Web hizmeti, CLI aracı oluşturuyor veya REST API'lerini entegre ediyor olsanız da, bu dönüştürücü zaman kazandırır ve tüm Rust kod tabanınızda tür güvenliğini korumanıza yardımcı olur.

Sıkça Sorulan Sorular

Kod Uygulaması

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.