Rust 在 JSON 序列化时复用结构体字段

依赖

toml 复制代码
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = { version = "1" }

示例

参考 https://serde.rs/attr-flatten.html

rust 复制代码
#[derive(serde::Serialize, serde::Deserialize, Debug, Copy, Clone)]
#[serde(rename_all(serialize = "camelCase", deserialize = "camelCase"))]
pub struct PageRequest {
    pub page: i32,
    pub size: i32,
}

#[derive(serde::Serialize, serde::Deserialize, Debug)]
#[serde(rename_all(serialize = "camelCase", deserialize = "camelCase"))]
pub struct PageResponse<T> {
    #[serde(flatten)]
    page_request: PageRequest,
    total: i64,
    content: Vec<T>,
}

impl Default for PageRequest {
    fn default() -> Self {
        Self { page: 1, size: 10 }
    }
}

fn main() {
    // language=json
    let json = r#"{ "page": 1, "size": 5, "total": 100, "content": [1, 2, 3, 4, 5] }"#;

    let page_response = serde_json::from_str::<PageResponse<i32>>(json).unwrap();
    println!("{page_response:?}");

    let json = serde_json::to_string_pretty(&page_response).unwrap();
    println!("{json}")
}
相关推荐
Rust研习社4 小时前
Once、OnceCell、OnceLock:Rust 一次性初始化终极指南
后端·rust·编程语言
Rust研习社4 小时前
从入门到实践:Rust 异步编程完全指南
开发语言·后端·rust
Rust研习社7 小时前
Rust Pin 解析:核心原理与异步编程实践
开发语言·后端·rust
sagima_sdu8 小时前
Codex 使用指南(技术向):App、CLI 与工作流接入
linux·运维·语言模型·json
圆山猫9 小时前
[AI] [Linux] 教我编一个启用rust的riscv kernel用于qemu启动
linux·ai·rust
代码羊羊10 小时前
Rust-特征trait和特征对象
服务器·网络·rust
圆山猫10 小时前
[AI] [Linux] 教我用rust写一个GPIO驱动
linux·rust
DevilSeagull13 小时前
Rust 结构体详解:从定义到实例化的指南
开发语言·算法·安全·rust
圆山猫13 小时前
[AI] [RISCV] 用 Rust 写一个 RISC-V BootROM:从 QEMU 到真实硬件
开发语言·rust·risc-v
小糖学代码1 天前
LLM系列:1.python入门:15.JSON 数据处理与操作
开发语言·python·json·aigc