← 中文资源

简体中文版本

用 Serde 重命名外部 JSON 字段

通过 rename_all 与字段级 rename 把 Rust 命名映射到 camelCase 和带连字符的 e-mail,并用 skip_serializing_if 省略空字段。

阅读英文原文

功能说明

示例展示如何让 Rust 字段名与外部 JSON 命名解耦。rename_all = "camelCase" 把 user_id、display_name 映射为 userId、displayName;字段级 rename = "e-mail" 覆盖全局规则,处理带连字符的键;default 让缺失的可选字段使用 None,skip_serializing_if 在序列化时省略空值。

关键代码

#[derive(Debug, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
struct UserProfile {
    user_id: u64,
    display_name: String,
    #[serde(rename = "e-mail")]
    email: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    avatar_url: Option<String>,
}

属性只影响序列化层,结构体字段在 Rust 代码里仍保持 snake_case。

使用注意

  • rename_all 对枚举变体同样有效,但不同大小写风格要按 serde 支持的取值填写。
  • 字段级 rename 优先级高于容器级规则,适合处理 e-mail、@type 等特殊键。
  • skip_serializing_if 只影响输出,反序列化仍需 default 才能接受缺失字段。
  • 重命名后结构体字段顺序不影响 JSON 对象语义,但会影响快照测试的字符串比较。
  • 与外部 API 对接时应为未知字段保留扩展策略,必要时使用 #[serde(flatten)]。

验证方式

示例序列化后应包含 userId、displayName 与 e-mail,且不包含 avatarUrl;反序列化给定 JSON 后 user_id 为 9。可以给 avatar_url 赋值再序列化,确认空值省略逻辑。