如何避免在序列化 null 值或默认值时生成 JSON?
How do I avoid generating JSON when serializing a value that is null or a default value?
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,
}
当group
为None
且proportion
为0时,JSON字符串应为"{}"
感谢您的回答,它可以解决Option
问题,但是0
有none解决方案。
linkSkip 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
}
有几种方法可以做到这一点:
- 用
skip_serialising_if
属性标记每个字段,以说明何时跳过它们。这要容易得多,但您必须记住对每个字段都这样做。
- Write your own Serde serialiser 执行此自定义 JSON 表单。这是更多的工作,但应该不会太糟糕,特别是考虑到您仍然可以使用股票 JSON 反序列化器。
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,
}
当group
为None
且proportion
为0时,JSON字符串应为"{}"
感谢您的回答Option
问题,但是0
有none解决方案。
linkSkip 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
}
有几种方法可以做到这一点:
- 用
skip_serialising_if
属性标记每个字段,以说明何时跳过它们。这要容易得多,但您必须记住对每个字段都这样做。 - Write your own Serde serialiser 执行此自定义 JSON 表单。这是更多的工作,但应该不会太糟糕,特别是考虑到您仍然可以使用股票 JSON 反序列化器。