跳到正文

JSON 转 Rust 结构体

JSON to Rust Structs

从 JSON 样例生成带 serde 标注的 Rust 结构体,可空或缺失的字段用 Option,键名用 snake_case 加 rename 处理。

从一份 JSON 样例文档输出带 `serde` derive 的 Rust 结构体——`Serialize`、`Deserialize`,在有时缺失的字段上加正确的 `Option<…>`,在 JSON 键不是合法 snake_case 字段名的地方加 `#[serde(rename = "…")]`。

🔒 完全在你的浏览器里运行rustjsoncodegenserde
生成语言

示例 JSON

拖入 .json 文件

在这个标签页里读取,不上传。

手上有几条就全放进来。每多一条记录,推断就更收紧一点——某条里缺了的字段,正是它被判成可选的依据。

Rust

怎么用

  1. 有多少条记录就粘贴多少

    每个数组的每个元素都会被读取并合并,不只是第一个。三条记录告诉它的远比一条多,因为某个字段在其中一条里缺失,正是让那个字段变成可选的依据。

  2. 给根类型起名

    嵌套对象按持有它的键命名,数组会转成单数,所以 `users` 得到 `User`。只有根需要你起名。

  3. 读输出下方的计数

    类型数、可选字段数、联合类型数,以及合并了多少条记录。联合类型计数大于零,说明某个字段在你的样本里出现过两种不同的值——把结果粘进代码库之前值得看一眼。

  4. 把结构体粘进你的 crate

    `use serde::{Deserialize, Serialize};` 这一行替你写好了;crate 本身和它的 `derive` feature 要你自己加进 Cargo.toml。

常见问题

为什么有个字段输出成了 `serde_json::Value`?

因为它在样本里出现过不止一种值——一条记录里是字符串,另一条里是数字。Rust 在这里没有无标签联合可以退回去,`Value` 是诚实的类型:它能反序列化,而且不对里面是什么撒谎。

这里 `Option<T>` 和 `#[serde(default)]` 有什么区别?

在部分记录里是 `null` 的字段变成 `Option<T>`;干脆不存在的字段还会加上 `#[serde(default)]`,这样反序列化一条没有它的记录会成功而不是报错。样本里两种情况都出现过时,两者一起出现。

字符串字段会生成枚举吗?

不会。所有字符串都是 `String`。从几条记录推出一个枚举,意味着生产环境第一次发来样本里没有的变体时就反序列化报错,这比一个宽松的类型更糟。

能 derive 别的 trait 吗?

自己加——输出的 derive 列表特意只有 `Serialize, Deserialize`。`Debug` 和 `Clone` 几乎总是也要的,但那是一行的改动,而猜错了会让无法 derive 它们的类型编译不过。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。