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}")
}
相关推荐
2401_8603195229 分钟前
【无标题】
开发语言·学习·rust
微小冷1 小时前
Rust实战教程:做一个UDP聊天软件
rust·udp·egui·聊天软件·rust教程·用户图形界面
星释5 小时前
Rust 练习册 :Rail Fence Cipher与栅栏密码
开发语言·算法·rust
Source.Liu6 小时前
【Chrono】Cargo.toml 配置文件深度分析
rust·time
shykevin10 小时前
Rust入门
开发语言·后端·rust
lpfasd12310 小时前
Rust + WebAssembly:让嵌入式设备被浏览器调试
开发语言·rust·wasm
愤怒的苹果ext11 小时前
MySQL JSON查询与索引
mysql·json·虚拟列·多值索引
星释12 小时前
Rust 练习册 :Luhn Trait与Trait实现
网络·算法·rust
dcloud_jibinbin14 小时前
【uniapp】解决小程序分包下的json文件编译后生成到主包的问题
前端·性能优化·微信小程序·uni-app·vue·json
lqj_本人14 小时前
Rust与Go:现代系统编程语言的深度对比
开发语言·golang·rust