序列化null或默认值时如何避免生成JSON?

时间:2018-12-23 01:49:36

标签: rust serde-json

serde_json::to_string()函数将生成一个字符串,其中可能包括null的{​​{1}}或Option<T>的{​​{1}}。这会使输出更大,所以我想忽略这些类型的值。

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

0

u32use 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的问题,但是对于"{}"没有解决方案。

2 个答案:

答案 0 :(得分:1)

您可以通过以下两种方式进行操作:

  • 使用skip_serialising_if属性标记每个字段,以说明何时跳过它们。这要容易得多,但是您必须记住在每个字段都要做。
  • Write your own Serde serialiser执行此自定义JSON形式。这是更多的工作,但应该还不错,特别是考虑到您仍然可以使用普通的JSON反序列化器。

答案 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
}