跳到主内容
UniKit

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

这个工具能做什么

  • 用 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结构体序列化代码生成

同类工具