JSON 转 Rust 结构体工具
根据 JSON 样例生成派生 serde Serialize 和 Deserialize 的 Rust 结构体。
从 JSON 生成 serde 结构体
在 Rust 中读取 JSON,通常的做法是借助 serde 和 serde_json 将其反序列化为结构体。本工具会根据样例生成这些结构体:每个对象生成一个带 #[derive(Serialize, Deserialize)] 的 struct,嵌套对象生成独立的结构体,数组映射为 Vec<T>,整数映射为 i64,小数映射为 f64,字符串映射为 String。字段名保持 snake_case,当某个 JSON 键不是合法的 snake_case 标识符时,会自动添加 #[serde(rename = "...")] 属性。
使用方法
- 粘贴一段 JSON 样例,例如事件数据或配置文件。
- 输入根结构体名称,例如 Event。
- 在 Cargo.toml 中添加 serde(启用 derive 特性)和 serde_json,将结构体粘贴到模块中,然后用 serde_json::from_str::<Event>(&text) 解析。
常见问题
- 为什么字段是私有的?
- 生成器不会给字段加 pub,这对于模块内部的 serde 使用已经足够。如果需要在其他模块中读取某些字段,请为它们加上 pub。
- 可选字段如何表示?
- 如果某个字段在部分样例数据中为 null 或缺失,它会被生成为 Option<T>,这样 serde 两种情况都能接受。始终存在的字段使用普通类型,缺失时会导致反序列化错误。
- 需要哪些 crate?
- 添加 serde(features = ["derive"])和 serde_json 即可。输出顶部的注释中还展示了旧式的 extern crate 写法,当前的 Rust edition 已不再需要。
示例:JSON 转 Rust
输入 JSON
{
"event_type": "page_view",
"timestamp": 1735689600,
"user_id": "u_123",
"properties": { "path": "/pricing", "referrer": "google" }
}生成的 Rust 代码(Event)
// Example code that deserializes and serializes the model.
// extern crate serde;
// #[macro_use]
// extern crate serde_derive;
// extern crate serde_json;
//
// use generated_module::Event;
//
// fn main() {
// let json = r#"{"answer": 42}"#;
// let model: Event = serde_json::from_str(&json).unwrap();
// }
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
pub struct Event {
event_type: String,
timestamp: i64,
user_id: String,
properties: Properties,
}
#[derive(Serialize, Deserialize)]
pub struct Properties {
path: String,
referrer: String,
}