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}")
}
相关推荐
晓13131 小时前
第一章:Redis 安装与入门
redis·json·nosql
爱编程的小庄4 小时前
Rust初识
开发语言·rust
爱编程的小庄5 小时前
Rust 发行版本及工具介绍
开发语言·后端·rust
AI视觉网奇6 小时前
ue 5.5 c++ mqtt 订阅/发布 json
网络·c++·json
skywalk81637 小时前
FreeBSD下安装rustup、cargo和uv
开发语言·python·rust·cargo
咸甜适中9 小时前
双色球、大乐透兑奖分析小程序(rust_Tauri + Vue3 + sqlite)
爬虫·rust·sqlite·vue3·tauri2
忠实米线9 小时前
使用lottie.js播放json动画文件
开发语言·javascript·json
rustfs9 小时前
使用 podman 容器化安装 RustFS 详细指南
docker·rust·podman
热爱学习的小翁同学1 天前
SharePoint 列格式化 JSON 配置
json·sharepoint
qq_338032921 天前
Vue/JS项目的package.json文件 和java项目里面的pom文件
java·javascript·vue.js·json