You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需重写序列化器,如何在Serde中为结构体X添加字段d(值为"qwe")

无需重写序列化器为Rust结构体添加JSON字段的方法

下面提供几种无需从头实现X的序列化器,就能在JSON输出中添加字段d(值为"qwe")的方案:

方案1:直接构造扩展JSON值

利用serde_json::json!宏手动组合原结构体字段与新增字段,无需修改原结构体定义:

use serde::Serialize;
use serde_json::json;

#[derive(Serialize)]
struct X {
    a: u32,
    b: u32,
    c: u32,
}

fn main() {
    let x = X { a: 1, b: 2, c: 3 };
    
    let extended_json = json!({
        "a": x.a,
        "b": x.b,
        "c": x.c,
        "d": "qwe"
    });
    
    println!("{}", serde_json::to_string_pretty(&extended_json).unwrap());
}

方案2:用flatten属性包装结构体

借助serde的flatten特性,创建包含原结构体和新增字段的包装结构体,自动合并字段输出:

use serde::Serialize;

#[derive(Serialize)]
struct X {
    a: u32,
    b: u32,
    c: u32,
}

#[derive(Serialize)]
struct XWithD<'a> {
    #[serde(flatten)]
    inner: &'a X,
    d: &'static str,
}

fn main() {
    let x = X { a: 1, b: 2, c: 3 };
    let x_with_d = XWithD { inner: &x, d: "qwe" };
    
    println!("{}", serde_json::to_string_pretty(&x_with_d).unwrap());
}

方案3:自定义序列化辅助函数

给原结构体添加#[serde(serialize_with)]属性,通过辅助函数先序列化原结构体,再插入新增字段:

use serde::{Serialize, Serializer};
use serde_json::Value;

#[derive(Serialize)]
#[serde(serialize_with = "serialize_x_with_d")]
struct X {
    a: u32,
    b: u32,
    c: u32,
}

fn serialize_x_with_d<S>(x: &X, serializer: S) -> Result<S::Ok, S::Error>
where
    S: Serializer,
{
    // 将原结构体序列化为JSON Value
    let mut value = serde_json::to_value(x)
        .map_err(|e| serde::ser::Error::custom(e.to_string()))?;
    
    // 插入新增字段
    if let Value::Object(ref mut map) = value {
        map.insert("d".to_string(), Value::String("qwe".to_string()));
    }
    
    // 序列化扩展后的Value
    value.serialize(serializer)
}

fn main() {
    let x = X { a: 1, b: 2, c: 3 };
    println!("{}", serde_json::to_string_pretty(&x).unwrap());
}

内容的提问来源于stack exchange,提问作者porton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:06:34