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 = "…")]`。
示例 JSON
拖入 .json 文件
在这个标签页里读取,不上传。
手上有几条就全放进来。每多一条记录,推断就更收紧一点——某条里缺了的字段,正是它被判成可选的依据。
Rust
怎么用
有多少条记录就粘贴多少
每个数组的每个元素都会被读取并合并,不只是第一个。三条记录告诉它的远比一条多,因为某个字段在其中一条里缺失,正是让那个字段变成可选的依据。
给根类型起名
嵌套对象按持有它的键命名,数组会转成单数,所以 `users` 得到 `User`。只有根需要你起名。
读输出下方的计数
类型数、可选字段数、联合类型数,以及合并了多少条记录。联合类型计数大于零,说明某个字段在你的样本里出现过两种不同的值——把结果粘进代码库之前值得看一眼。
把结构体粘进你的 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 它们的类型编译不过。
可以从这些接进来
JSON 转 Go 结构体
JSON to Go Structs
从 JSON 样例生成带 json tag 的 Go 结构体,嵌套和重复出现的类型都能处理。
JSON 格式化与校验
JSON Formatter & Validator
把 JSON 美化成缩进形式或压成一行,校验语法并直接指出出错的行和列。
YAML 格式化与校验
YAML Formatter & Validator
统一 YAML 缩进并校验语法,把会让解析器崩掉的制表符和锚点错误标出来。
TOML 格式化与校验
TOML Formatter & Validator
格式化并校验 TOML,统一表的排列顺序和内联表的写法。
接下来
这些工具吃得下当前工具的产出,结果可以直接送过去。
JSON 格式化与校验
JSON Formatter & Validator
把 JSON 美化成缩进形式或压成一行,校验语法并直接指出出错的行和列。
JSON 转 Go 结构体
JSON to Go Structs
从 JSON 样例生成带 json tag 的 Go 结构体,嵌套和重复出现的类型都能处理。
JSON 转 TypeScript 类型
JSON to TypeScript
从一份 JSON 样例推断 TypeScript 接口或类型,合并可选字段和联合类型。
Base64 编码解码
Base64 Encoder & Decoder
对文本和文件做 Base64 与 Base64URL 编解码,UTF-8 处理正确。
curl 转代码
curl to Code
把一条 curl 命令转成 fetch、axios、Python requests、Go、PHP 或 PowerShell 代码。
文本哈希计算
Text Hash
算出字符串的 MD5、SHA-1、SHA-256、SHA-384、SHA-512 和 CRC-32,输出可选大写或 Base64。