Skip to content

JSON 转 Rust 结构体转换器

粘贴 JSON 即时获得地道的 Rust serde 结构体,100% 在浏览器中运行。正确推断 i64/u64/f64 类型,null 用 Option,camelCase 自动加 #[serde(rename)]。免费。

无追踪 浏览器中运行 免费
选项
0 字符
Rust 输出
0
已对照 serde 语义和 rustfmt 格式化,针对真实 API 负载进行验证。 — Go Tools 工程团队 · 2026年7月2日

什么是 JSON 转 Rust?

JSON 转 Rust 会把一段 JSON 示例转换为可直接编译的 Rust 结构体,带上 serde 的 #[derive(Serialize, Deserialize)] 宏,让你无需为 API 响应或配置文件手写反序列化样板代码。这个快速的 Rust 结构体生成器会推断正确的数字类型,把缺失的字段标记为 Option,并为非 snake_case 键添加 #[serde(rename)] — 全部 100% 在浏览器中完成。

示例

API 响应

{"id":101,"name":"Ada Lovelace","email":"ada@example.com","active":true,"roles":["admin","user"]}
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
    pub id: i64,
    pub name: String,
    pub email: String,
    pub active: bool,
    pub roles: Vec<String>,
}

典型的 REST 负载会变成可直接放入客户端的 serde 结构体。数字推断为 i64,数组变成 Vec<String>。

嵌套对象

{"repo":"serde","owner":{"login":"dtolnay","id":100}}
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
    pub repo: String,
    pub owner: Owner,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Owner {
    pub login: String,
    pub id: i64,
}

嵌套对象会成为独立命名的结构体(Owner),按字段引用;结构相同的会被去重。

对象数组(可选字段)

{"users":[{"id":1,"nick":"x"},{"id":2}]}
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
    pub users: Vec<User>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
    pub id: i64,
    pub nick: Option<String>,
}

对象数组会合并为一个元素结构体。部分元素缺失的键会变成 Option<String> — 无需 #[serde(default)]。

camelCase 键名

{"login":"octocat","publicRepos":15,"followerCount":9001,"createdAt":"2011-01-25"}
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
    pub login: String,
    #[serde(rename = "publicRepos")]
    pub public_repos: i64,
    #[serde(rename = "followerCount")]
    pub follower_count: i64,
    #[serde(rename = "createdAt")]
    pub created_at: String,
}

字段变成 snake_case,并用 #[serde(rename)] 映射回原始 JSON 键。已经是 snake 形式的键(如 login)不会添加 rename。

如何将 JSON 转换为 Rust

  1. 1

    粘贴你的 JSON

    将 JSON 对象、数组或 API 响应放入输入框,转换即刻开始。

  2. 2

    调整输出

    重命名根结构体,切换 serde derive、Debug 和 Clone,或 pub 可见性,以匹配你的 crate 风格。

  3. 3

    复制或下载

    一键获取生成的 Rust 代码,直接粘贴到你的项目中。

Common Use Cases

带类型的 API 客户端
将 REST 或 GraphQL 响应示例转换为 serde 结构体,用于 reqwest 或类似客户端,无需手写反序列化样板代码。
配置与测试夹具解析
为需要用 serde_json 反序列化的 JSON 配置文件、测试夹具或 webhook 负载生成结构体。
快速原型开发
粘贴一个不熟悉的负载,即时看到它作为 Rust 类型的结构 — 在接入前快速探索新 API 的方式。

转换原理

结构推断
每个对象都会成为一个命名结构体;结构相同的会被去重,因此你得到的是一个结构体而非多份副本。对象数组会逐键合并,部分元素缺失的键会变成 Option<T>。
正确的数字类型
整数映射为 i64,超过 i64::MAX 时提升为 u64,超过 u64 则回退到 f64。浮点数会从 token 中识别(1.0、2e3),因此 serde 反序列化绝不会因浮点数放入整数而失败。
地道且可编译的标识符
键会变成 snake_case 字段,并用 #[serde(rename)] 映射回原始键;Rust 关键字、重复名称和非标识符键都会被净化,因此输出始终能编译。
100% 浏览器端
解析和生成都在浏览器中运行,没有任何网络请求,因此你的数据保持私密。

编写整洁 Rust 结构体的技巧

为根结构体命名
设置一个有意义的根名称(如 User、ApiResponse),而非默认的 Root,让代码更易读。
仅在需要时添加 serde_json
serde_json::Value 会出现在空数组或混合类型数组以及只有 null 的字段中。如果可以,请用更完整的示例为这些字段指定具体类型,或在 Cargo.toml 中添加 serde_json。
检查 Option 与必填的区别
只有当示例省略某字段时,它才会被标记为 Option<T>。请粘贴有代表性的负载,让工具准确推断必填与可选字段。

常见问题

如何将 JSON 转换为 Rust 结构体?
将 JSON 粘贴到输入框中,转换器会在浏览器中即时解析,并在右侧生成带 serde derive 的 Rust 结构体。点击「复制」即可获取结果 — 无需上传、无需账户、无需等待。
它会生成 serde derive 吗?我需要 serde 和 serde_json 吗?
会 — 输出默认使用 #[derive(Debug, Clone, Serialize, Deserialize)]。请在 Cargo.toml 中添加启用 derive feature 的 serde。只有当输出包含 serde_json::Value(出现在空数组、混合数组以及只有 null 的字段中)时,才需要把 serde_json 作为依赖。关闭 serde 开关即可生成纯结构体。
如何用生成的结构体来解析 JSON?
在 Cargo.toml 中添加 serde_json,然后用一行完成反序列化:let root: Root = serde_json::from_str(json)?;。生成的 Deserialize derive 会处理其余部分 — 字节切片用 serde_json::from_slice,文件或 HTTP 主体用 from_reader,序列化回去用 serde_json::to_string。
可选字段和 null 字段是如何处理的?
当某个键只出现在部分数组元素中时,它会成为 Option 字段。只会是 null 的字段会成为可选的 serde_json::Value。serde 会自动把 Option 视为可选,因此不会添加也不需要 #[serde(default)] 属性。
它如何处理 camelCase 键名和 Rust 关键字?
字段名会转换为地道的 snake_case,并用 #[serde(rename)] 属性映射回准确的 JSON 键。像 type 或 match 这样的保留关键字会带 rename 输出为 type_ 或 match_,这比原始标识符更稳健,因为它同样覆盖 self、crate 和 super。
它能用 #[serde(rename_all)] 代替逐字段 rename 吗?
本工具输出逐字段的 #[serde(rename)],因为它始终有效 — 即使一个负载混用 camelCase、snake_case 和不规则键也没问题。如果某个结构体的每个字段都遵循同一种命名约定,可以删除这些属性,改在结构体上放一个 #[serde(rename_all = "camelCase")];两者的反序列化结果完全一致。
它使用哪种 Rust 数字类型?
整数映射为 i64,当值超过 i64::MAX 时用 u64,超过 u64 则回退到 f64 — 这样大型 ID 仍能往返无损。任何带小数点或指数的数字(如 1.0 或 2e3)都映射为 f64,因为 serde 会拒绝把浮点数放进整数字段。
日期和时间戳是如何标注类型的?
JSON 没有日期类型,所以像 2011-01-25 这样的 ISO 字符串或 RFC 3339 时间戳会输出为 String。若要真正处理日期,请把字段改为 chrono 类型 — Utc 时区的 DateTime,或 NaiveDate — 并启用 chrono 的 serde feature。之后 serde 会自动解析 RFC 3339。
如何处理键是动态或未知的对象?
当键会变化时 — 例如从 ID 到值的映射 — 请把生成的结构体替换为以 String 为键的 HashMap。若想保留带类型的结构体同时捕获额外字段,可添加一个类型为 HashMap 的 #[serde(flatten)] 字段。对于完全动态的值,serde_json::Value 是万能类型。
我的 JSON 数据是否私密安全?
是的。转换 100% 在浏览器中通过 JavaScript 完成。你的 JSON — 包括 token、ID 或客户数据 — 永不离开页面,也永不发送到服务器。
我能生成不带 serde 的纯 Rust 结构体吗?
可以。关闭 serde 开关即可去掉 use serde 行、Serialize 和 Deserialize derive,以及所有 #[serde(rename)] 属性 — 只留下干净的结构体。你还可以切换 Debug 和 Clone derive,以及 pub 可见性。
本工具免费吗?需要账户吗?
完全免费,无需注册,无使用限制,也没有广告干扰工作区。