无需重写序列化器,如何在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
相关产品推荐
相关产品推荐

