JSON 转 Rust Struct
生成嵌套 Rust Struct、Serde Derive、Rename、Vec 与 Option 字段
根据样本推断,不是完整 API 契约。字段缺失与显式 null 分别推断,输出类型可能合并两者;数组内的 null 单独保留可空性。重复键和会改变数值的输入会报错。
上限:1 MiB、64 层、20,000 个值、200 个模型、2,000 个模型字段。精确大整数或金额请用字符串。
目标:Rust 2021、serde(derive)与 serde_json。混合值使用 serde_json::Value,即使关闭 derive 仍可能需要此依赖。
生成后请在目标项目编译,并用代表性响应验证反序列化。
工具说明
JSON 转 Rust Struct 生成 Rust 2021 声明,可选择 Serde derive 与字段重命名。它独立推断对象字段缺失与 null,并在数组各层保留可空性:整数或 null 列表生成 Vec<Option<i64>>,列表自身可空时则可能生成 Option<Vec<...>>。不兼容样本和无法推断元素类型的空数组使用 serde_json::Value;关闭 Serde derive 并不会移除这种类型依赖。Rust 关键字使用安全后缀,包括不能直接写成原始标识符的 self、super、crate。字段和嵌套模型名称规范化后会分配唯一名称,Serde rename 字符串保留原键及转义。缺失字段使用带 default 的 Option,但解码后模型不区分缺失和显式 null。本地解析最多接受 1 MiB、64 层、20,000 个值、200 个模型与 2,000 个字段,拒绝重复键、无效 Unicode 和改变数值的转换。输出虽然使用 i64,输入整数仍限制在浏览器安全范围。请在目标 crate 配置带 derive 的 serde 与 serde_json,编译并验证实际样本,再决定领域枚举或自定义反序列化逻辑。
场景配方
核对 Rust 客户端嵌套可空性
目标:通过测试确认列表中的空值不会变成整数零。
- 粘贴 {"self":1,"values":[1,null,2]} 并开启 Serde。
- 生成后确认 self_value 带 rename = "self",values 使用 Vec<Option<i64>>。
- 在测试 crate 添加 serde derive 与 serde_json,解码并确认第二个元素是 None。
结果:通过测试确认列表中的空值不会变成整数零。
失败门诊(高频踩坑)
字段使用 Option,数组仍解码失败
原因:字段可选不会自动使每个数组元素可空。
修复:保留 null 元素对应的内部 Option,并测试整个列表为 null 与列表含 null 两种情况。
没有 derive 的 Struct 仍需要 serde_json
原因:未知或混合值由 serde_json::Value 表示。
修复:保留依赖,或将通用类型替换成已经审核的领域类型及解码器。
生产可用片段
可空元素与关键字字段
rust
// Input: {"self":1,"values":[1,null,2]}
#[derive(serde::Serialize, serde::Deserialize)]
struct ApiResponse {
#[serde(rename = "self")]
self_value: i64,
values: Vec<Option<i64>>,
}常见问题
为什么 self 被改成 self_value?
Rust 不允许 self、super、crate 作为原始标识符。生成器添加安全后缀,并用 Serde rename 映射原名。
Vec<Option<T>> 与 Option<Vec<T>> 有何区别?
前者允许已有数组内出现 null 元素,后者允许整个数组为 null;有时两者需要同时出现。
关闭 Serde 能移除所有依赖吗?
如果混合或未知值仍使用 serde_json::Value,就不能。界面会说明此依赖;明确真实契约后再替换字段类型。
Option 能区分缺失与 null 吗?
不能,在此模型中二者都解码为 None。部分更新需要区分时,应另外记录字段是否出现。
继续浏览