You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:32:38