JSON 转 Rust 结构体(serde)

从 JSON 生成 Rust 结构体,自动加上 serde 的序列化与反序列化 derive、snake_case 字段名、rename 属性,null 对应 Option,数组对应 Vec。免费。

需要 serde(启用 derive)和 serde_json crate。字段使用 snake_case,与 JSON 键不同时添加 #[serde(rename)]。

完全在浏览器中运行,您的数据不会被上传。

相关工具

查看全部

什么是 JSON 转 Rust?

粘贴 JSON,即可得到能用 serde 反序列化它的 Rust struct 定义。每个结构体都 derive Debug, Clone, Serialize, Deserialize;字段名为 snake_case,需要时通过 #[serde(rename = "…")] 保留原始键名。

如何使用 JSON 转 Rust

  1. 将 JSON 示例粘贴到 JSON 输入中(或点击加载示例/打开文件)。
  2. 设置根类型名称(默认为 Root)。
  3. 复制生成的 Rust 代码,或下载为文件。

示例

输入
{"id":1,"name":"A","tags":["x"]}
输出
use serde::{Deserialize, Serialize};

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

何时使用 JSON 转 Rust

适合编写读取 JSON 的 Rust 客户端或命令行工具。之后请进一步完善类型——例如小计数用 u32,时间戳用 chrono 类型——因为示例无法告诉你真实的取值范围。

JSON 转 Rust 的工作原理

程序会递归遍历示例,每个位置都会收集见到过的类型。对象数组会合并为一个类型:在部分元素中缺失的键变为可选,在某处为 null 的键变为可空,整数与小数混合会变为浮点类型,其他混合了多种类型的情况则回退为动态类型。嵌套对象成为各自命名的类型(键名的 PascalCase,数组键取单数:orders → Order),名称冲突时添加数字后缀。Rust 输出把整数映射为 i64,小数映射为 f64,字符串映射为 String,布尔值映射为 bool,数组映射为 Vec<T>,可空值映射为 Option<T>,动态值或只有 null 的值映射为 serde_json::Value。在部分示例中缺失的字段会变成带 #[serde(default, skip_serializing_if = "Option::is_none")] 的 Option<T>。type 等关键字会写成原始标识符(r#type)。

常见用例

  • 用 reqwest + serde 反序列化 REST API 响应
  • 为命令行工具建立 JSON 配置文件的模型
  • 为 Webhook 处理程序创建类型
  • 为 Rust 集成测试转换测试数据

常见问题

我需要哪些 crate?

带 derive 特性的 serde 和 serde_json:serde = { version = "1", features = ["derive"] } 以及 serde_json = "1"。

为什么用 serde_json::Value?

当某个键混合了多种类型,或在示例中始终为 null 时使用,因为无法安全地选定具体的 Rust 类型。

为什么是 r#type?

type 是 Rust 关键字;原始标识符语法让你可以把它用作字段名,同时 serde 仍能匹配 JSON 键。

探索更多分类