【问题标题】:How do I avoid generating JSON when serializing a value that is null or a default value?序列化为 null 或默认值的值时如何避免生成 JSON?
【发布时间】:2018-12-23 01:49:36
【问题描述】:

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字符串应为"{}"

感谢How do I change Serde's default implementation to return an empty object instead of null?的回答,可以解决Option问题,但是0没有解决办法。

【问题讨论】:

标签: rust serde-json


【解决方案1】:

链接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
}

【讨论】:

    【解决方案2】:

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

    • skip_serialising_if 属性标记每个字段以说明何时跳过它们。这要容易得多,但您必须记住为每个领域都这样做。
    • Write your own Serde serialiser 执行此自定义 JSON 表单。这是更多的工作,但应该不会太糟糕,特别是考虑到您仍然可以使用现有的 JSON 反序列化器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-02
      • 2022-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      相关资源
      最近更新 更多