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 = "...")] 属性。

使用方法

  1. 粘贴一段 JSON 样例,例如事件数据或配置文件。
  2. 输入根结构体名称,例如 Event。
  3. 在 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,
}

将 JSON 转换为其他语言