JSON to Rust Struct
将JSON对象转换为Rust结构体定义,支持serde derive宏。
关于此工具
JSON to Rust Struct 是一个代码生成工具,可以自动将 JSON 数据转换为强类型的 Rust struct 定义。由于 Rust 需要显式的类型声明,手动从 JSON 编写 struct 会很繁琐,特别是对于大型或深层嵌套的对象。该工具通过分析 JSON 结构并生成带有 serde 派生宏的 struct 代码,消除了这种重复性工作。
只需将 JSON 数据粘贴到输入字段中,工具就会立即生成可在项目中直接使用的 Rust struct 代码。生成的 struct 包含标准的 serde 注释,与 serde_json 等流行的 Rust 库兼容。这在处理外部 API、配置文件或任何需要解析为 Rust 的基于 JSON 的数据时特别有用。
该工具可以智能处理可选字段和嵌套对象,减少编译前所需的手动调整。无论您是在构建 Web 服务、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.