JSON 转 Rust 结构体
JSON 自动生成 Rust struct
浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。
选项
生成的 Rust 代码
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RootOwner {
pub name: String,
pub email: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RootItems {
pub sku: String,
pub price: f64,
#[serde(skip_serializing_if = "Option::is_none")]
pub note: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
pub id: i64,
pub name: String,
pub is_active: bool,
pub score: f64,
pub owner: RootOwner,
pub tags: Vec<String>,
pub items: Vec<RootItems>,
pub meta: serde_json::Value,
}结果摘要: 类型数 3 · 字段数 13 · 命名冲突 0
类型完全由 JSON 推断:嵌套对象各自成一个 struct,数组是 Vec<T>,可空与可选字段写成 Option<T>(可选字段还会加 skip_serializing_if),异构数组与 null 用 serde_json::Value。默认带上 serde 的 derive,字段名被改写时用 #[serde(rename)] 把原始键补回来。
这个工具能做什么
- 用 reqwest / serde_json 解析第三方接口时,把返回的 JSON 样例变成带 serde derive 的 struct,直接 #[derive(Deserialize)] 就能反序列化。
- 处理可空字段:值为 null 或只在部分数组元素里出现的字段写成 Option<T>,可选字段还会带上 skip_serializing_if,序列化时不会输出多余的 null。
- JSON 键是 camelCase 而 Rust 字段按惯例写 snake_case 时,自动补 #[serde(rename = "...")],不用手写一堆重命名属性。
- Rust 保留字(type、match、loop 等)做键名时自动补下划线,生成的代码一定能编译。
示例
输入
{"id":1,"name":"UniKit","tags":["a","b"]}输出
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
pub id: i64,
pub name: String,
pub tags: Vec<String>,
}数字统一映射成 i64 / f64,字符串是 String,数组是 Vec<T>;异构数组和 null 字段用 serde_json::Value(需要 serde_json 依赖)。
常见问题
为什么字符串字段是 String 而不是 &str?
生成的结构体要能被反序列化并长期持有数据,&str 需要生命周期参数且只能借用已有数据。要零拷贝可以在自己的代码里改成 Cow<str> 或 &str 并补上生命周期。
什么情况下会用到 serde_json::Value?
JSON 里的值是 null、数组元素类型不一致(例如 [1, "a"])、或者数组是空的推不出元素类型时。这时字段会写成 serde_json::Value,记得在 Cargo.toml 里加上 serde_json 依赖。
serde rename 是必须的吗?
字段名和 JSON 键不一致时必须有,否则反序列化会找不到键、字段全部是默认值。默认开启,键名本来就是 snake_case 的字段不会生成多余的属性。
skip_serializing_if 是干什么的?
可选字段(只在部分数组元素里出现的键)在序列化回 JSON 时,如果值是 None 就整个键都不输出,避免往数据里塞一堆 null。只想反序列化的话删掉这行也没影响。
我的 JSON 会被上传吗?
不会。解析与代码生成全部在浏览器本地完成,不发起网络请求,断网可用。
关键词:jsonruststructserdeoptionjson to rustJSON 转 Rust结构体序列化代码生成