Serde 根据“全局”运行时条件跳过字段序列化

at5*_*321 5 rust serde

根据某些运行时条件,我想序列化或不序列化字段。该条件适用于整个序列化,与字段值本身无关。因此,如果我理解正确的话,我就不能使用skip_serializing_if()它,除非我使用某种全局状态,但这更像是一个常量,而不是一个“条件”。

例如,假设条件取决于请求文件的客户端。有些客户需要拥有该字段,而其他客户则不需要。

如果条件表示序列化,即使字段的值为序列化(即显式创建一个具有输出 JSON 中的值的None属性),也请执行序列化操作。null

实现这一目标的最简单、最干净的方法是什么?

Net*_*ave 4

只需创建一个函数并忽略参数:

use serde_json; // 1.0.67
use serde::Serialize; // 1.0.130

fn condition_met<T>(_: &T) -> bool {
    false
}

#[derive(Serialize)]
struct Foo {
    #[serde(skip_serializing_if = "condition_met")]
    data: Option<u32>,
}

fn main() {
    println!("{}", serde_json::to_string(&Foo{data: None}).unwrap());
}
Run Code Online (Sandbox Code Playgroud)

操场