9

serde_json::to_string()函数将生成一个字符串,该字符串可能包括null一个Option<T>0一个u32。这使得输出更大,所以我想忽略这些类型的值。

我想简化以下结构的 JSON 字符串输出:

use serde_derive::Serialize; // 1.0.82

#[derive(Serialize)]
pub struct WeightWithOptionGroup {
    pub group: Option<String>,
    pub proportion: u32,
}

groupNoneproportion是0时,JSON字符串应该是"{}"

感谢您的回答如何更改 Serde 的默认实现以返回空对象而不是 null?,它可以解决Option问题,但0没有解决方案。

4

2 回答 2

22

链接跳过序列化字段给了我答案。

和固定代码:

#[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
}
于 2018-12-23T02:08:10.617 回答
3

有几种方法可以做到这一点:

  • 用属性标记每个字段skip_serialising_if以说明何时跳过它们。这要容易得多,但您必须记住为每个领域都这样做。
  • 编写您自己的 Serde 序列化程序来执行此自定义 JSON 表单。这是更多的工作,但应该不会太糟糕,特别是考虑到您仍然可以使用库存的 JSON 反序列化器。
于 2018-12-27T20:28:49.723 回答