在Rust中能否实现结构体序列化为camel_case、反序列化为PascalCase?
可行,用Serde的
rename_all属性分别指定序列化/反序列化规则 完全可以实现这个需求,Serde支持为序列化和反序列化分别配置字段名的转换规则,不需要额外复杂操作。
核心实现方式
在结构体上使用#[serde(rename_all(serialize = "camelCase", deserialize = "PascalCase"))]属性,就能让结构体:
- 序列化时自动将字段名转为camelCase格式
- 反序列化时自动识别PascalCase格式的字段名
完整代码示例
use serde::{Deserialize, Serialize}; use serde_json; #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all(serialize = "camelCase", deserialize = "PascalCase"))] struct User { user_id: u32, user_name: String, is_active: bool, } fn main() { // 反序列化:从PascalCase的JSON字符串转换为结构体 let json_pascal = r#"{ "UserId": 1001, "UserName": "Alice", "IsActive": true }"#; let user: User = serde_json::from_str(json_pascal).unwrap(); println!("反序列化结果: {:?}", user); // 序列化:将结构体转为camelCase的JSON字符串 let json_camel = serde_json::to_string_pretty(&user).unwrap(); println!("序列化结果:\n{}", json_camel); }
输出结果
反序列化会正确解析UserId、UserName等PascalCase字段,序列化后生成的JSON会是:
{ "userId": 1001, "userName": "Alice", "isActive": true }
个别字段的特殊处理
如果某个字段需要单独指定序列化/反序列化的名称,而不遵循全局规则,可以给字段添加#[serde(rename(serialize = "...", deserialize = "..."))]属性:
#[derive(Debug, Serialize, Deserialize)] #[serde(rename_all(serialize = "camelCase", deserialize = "PascalCase"))] struct User { user_id: u32, // 单独指定该字段序列化时为"fullName",反序列化时接受"CompleteName" #[serde(rename(serialize = "fullName", deserialize = "CompleteName"))] user_name: String, is_active: bool, }
内容的提问来源于stack exchange,提问作者mnk802
相关产品推荐
相关产品推荐

