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}")
}
相关推荐
樱桃花下的小猫11 小时前
腐蚀Rust-EAC 及官方验证关闭教程
服务器·rust·云鸢互联·零门槛一键开服·腐蚀rust服务器
咸甜适中11 小时前
rust语言学习笔记Trait(六) FromIterator(由迭代器创建集合)
笔记·学习·rust
查拉图斯特拉面条12 小时前
JMeter 实战:JSON 响应中文节点 + 数值精准断言(附真实接口案例)
jmeter·json
小杍随笔12 小时前
【Rust + Tauri 2 + TypeScript + Tailwind CSS 4 桌面应用 UI 组件选型深度对比(2026版)】
css·rust·typescript
iuyup1 天前
深度解析 OpenHuman:开源个人 AI 超级智能的 Memory 架构设计
人工智能·rust
Rooting++1 天前
package.json三种依赖的区别
vue.js·json
techdashen1 天前
Rust 泛型 vs Java 泛型:它们看起来相似,但骨子里截然不同
java·开发语言·rust
codealy1 天前
Rust 核心理论与内存安全(二)
安全·rust
Rust研习社1 天前
告别环境混乱!使用 mise 管理你的开发环境
前端·后端·rust