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}")
}
相关推荐
WujieLi1 小时前
初识 Vite+:一文了解 Rust 驱动的新一代前端工具链
javascript·rust·vite
std860212 小时前
Rust 与 Python – 这是未来的语言吗?
开发语言·python·rust
std78799 小时前
Rust 与 Go – 比较以及每个如何满足您的需求
开发语言·golang·rust
Amos_Web1 天前
Rust实战教程--文件管理命令行工具
前端·rust·全栈
alwaysrun1 天前
Rust中字符串与格式化
rust·display·格式化·string·str·精度
魔镜前的帅比1 天前
(开源项目)XSUN_DESKTOP_PET 2 (桌面宠物)
rust·宠物·tauri2
0110_10241 天前
tauri + rust的环境搭建---初始化以及构建
开发语言·后端·rust
像风一样自由20201 天前
Rust Tokio vs Go net/http:云原生与嵌入式生态选型指南
开发语言·golang·rust
大鱼七成饱2 天前
Rust Web 初学者必看:用一个宏搞定错误处理和统一返回
rust
Vallelonga2 天前
Rust 设计模式 Marker Trait + Blanket Implementation
开发语言·设计模式·rust