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

5
根据运行时条件,我希望将某个字段序列化或不序列化。该条件适用于整个序列化过程,与字段值本身无关。因此,如果我理解正确的话,不能使用 skip_serializing_if(),除非使用某种全局状态,但那更像是常量而不是“条件”。
例如,假设条件取决于请求文件的客户端。某些客户端需要该字段,其他客户端则不需要。
如果条件指示进行序列化,则即使字段的值为 None (即在输出JSON中明确创建具有 null 值的属性),也要进行序列化。
最简单和清晰的方法是什么?

全局运行时条件是如何提供的?像执行时的参数一样吗? - kometen
1
你应该能够使用 skip_serializing_if。你只需要忽略参数值,而是访问你的运行时条件(如文件、全局变量)即可。 - jonasbb
我更新了我的问题并添加了一个例子。 - at54321
1个回答

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());
}

Playground


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接