Pular para o conteúdo
🛠️ToolsShed

JSON to Rust Struct

Converta objetos JSON para definições de struct Rust com macros serde derive.

Sobre esta ferramenta

JSON to Rust Struct é uma ferramenta de geração de código que converte automaticamente dados JSON em definições de struct Rust com tipos seguros. Como Rust requer declarações explícitas de tipos, escrever structs manualmente a partir de JSON pode ser tedioso e propenso a erros, especialmente com objetos grandes ou profundamente aninhados. Esta ferramenta elimina esse trabalho repetitivo analisando a estrutura JSON e gerando código struct com macros serde derivadas para serialização e desserialização perfeitas.

Simplesmente cole seus dados JSON no campo de entrada e a ferramenta gera instantaneamente código struct Rust pronto para usar em seu projeto. Os structs gerados incluem anotações serde padrão, tornando-os compatíveis com bibliotecas Rust populares como serde_json. Isso é particularmente útil ao trabalhar com APIs externas, arquivos de configuração ou qualquer dado baseado em JSON que precise ser analisado em Rust.

A ferramenta trata campos opcionais e objetos aninhados de forma inteligente, reduzindo os ajustes manuais necessários antes da compilação. Se você está construindo um serviço web, uma ferramenta CLI ou integrando com APIs REST, este conversor economiza tempo e ajuda a manter a segurança de tipos em toda sua base de código Rust.

Perguntas Frequentes

Implementação de Código

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.