serde_json::to_string()
函数将生成一个字符串,其中可能包括null
的{{1}}或Option<T>
的{{1}}。这会使输出更大,所以我想忽略这些类型的值。
我想简化以下结构的JSON字符串输出:
0
当u32
为use serde_derive::Serialize; // 1.0.82
#[derive(Serialize)]
pub struct WeightWithOptionGroup {
pub group: Option<String>,
pub proportion: u32,
}
且group
为0时,JSON字符串应为None
感谢答案How do I change Serde's default implementation to return an empty object instead of null?,它可以解决proportion
的问题,但是对于"{}"
没有解决方案。
答案 0 :(得分:1)
您可以通过以下两种方式进行操作:
skip_serialising_if
属性标记每个字段,以说明何时跳过它们。这要容易得多,但是您必须记住在每个字段都要做。答案 1 :(得分:0)
链接Skip serializing field给了我答案。
和固定代码:
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Ord, PartialOrd, Eq)]
pub struct WeightWithOptionGroup {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub group: Option<String>,
#[serde(skip_serializing_if = "is_zero")]
#[serde(default)]
pub proportion: u32,
}
/// This is only used for serialize
#[allow(clippy::trivially_copy_pass_by_ref)]
fn is_zero(num: &u32) -> bool {
*num == 0
}