Перейти к содержимому

JSON to Rust Struct

Преобразуйте JSON-объекты в определения структур Rust с макросами derive serde.

Об этом инструменте

JSON to Rust Struct — это инструмент генерации кода, который автоматически преобразует данные JSON в строго типизированные определения struct Rust. Поскольку Rust требует явного объявления типов, ручное написание struct из JSON может быть утомительным и подверженным ошибкам, особенно для больших или глубоко вложенных объектов. Этот инструмент устраняет такую повторяющуюся работу, анализируя структуру JSON и генерируя код struct с производными макросами serde для беспроблемной сериализации и десериализации.

Просто вставьте данные JSON в поле ввода, и инструмент мгновенно создаст код struct Rust, готовый к использованию в вашем проекте. Созданные struct содержат стандартные аннотации serde, совместимые с популярными библиотеками Rust, такими как serde_json. Это особенно полезно при работе с внешними API, файлами конфигурации или любыми данными на основе JSON, которые необходимо разобрать в Rust.

Инструмент разумно обрабатывает опциональные поля и вложенные объекты, сокращая необходимость в ручных корректировках перед компиляцией. Независимо от того, создаёте ли вы веб-сервис, инструмент CLI или интегрируете REST API, этот конвертер экономит время и помогает поддерживать типобезопасность во всей кодовой базе Rust.

Часто задаваемые вопросы

Реализация кода

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.