功能说明
示例展示如何让 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 赋值再序列化,确认空值省略逻辑。