注意: 使用 skip_serializing
不会跳过 反序列化字段。如果只添加 skip_serializing
属性,然后尝试反序列化数据,会失败,因为仍会尝试反序列化已跳过的字段。请使用 skip
属性来同时跳过序列化和反序列化(参见字段属性: skip
)。同样,使用 skip_deserializing
来仅跳过反序列化。
use serde::Serialize;
use std::collections::BTreeMap as Map;
#[derive(Serialize)]
struct Resource {
name: String,
#[serde(skip_serializing)]
#[allow(dead_code)]
hash: String,
#[serde(skip_serializing_if = "Map::is_empty")]
metadata: Map<String, String>,
}
fn main() {
let resources = vec![
Resource {
name: "Stack Overflow".to_string(),
hash: "b6469c3f31653d281bbbfa6f94d60fea130abe38".to_string(),
metadata: Map::new(),
},
Resource {
name: "GitHub".to_string(),
hash: "5cb7a0c47e53854cd00e1a968de5abce1c124601".to_string(),
metadata: {
let mut metadata = Map::new();
metadata.insert("headquarters".to_string(),
"San Francisco".to_string());
metadata
},
},
];
let json = serde_json::to_string_pretty(&resources).unwrap();
println!("{}", json);
}