rust - Serde 跳过字段序列化取决于 "global"运行时条件

标签 rust serde

根据某些运行时条件,我想要么序列化一个字段,要么不序列化。该条件适用于整个序列化,与字段值本身无关。因此,我不能使用 skip_serializing_if()如果我理解正确,除非我使用某种全局状态,但这更像是一个常量,而不是一个“条件”。
例如,假设条件取决于请求文件的客户端。一些客户需要拥有该领域,而其他客户则不需要。
如果条件显示序列化,即使字段的值是 None 也要这样做(即在输出 JSON 中显式创建一个具有 null 值的属性)。
实现这一目标的最简单、最干净的方法是什么?

最佳答案

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

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

关于rust - Serde 跳过字段序列化取决于 "global"运行时条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69468743/

相关文章:

json - 使用 serde 将键和值列表反序列化为来自 JSON 的结构?

rust - 如何使用 serde 重命名 `start` 和 `end` 范围值?

string - 将 char 转换为 &str

module - 当有 main.rs 和 lib.rs 时 Rust 模块混淆

rust - 将 TOML 反序列化为具有值的枚举向量

json - 有没有办法在不创建细粒度对象的情况下使用 Serde 反序列化任意 JSON?

rust - 为什么我要获得 “Cannot Derive Macro In This Scope”?

json - 如何在不需要包装器类型的情况下反序列化 JSON 数组?

json - 为什么 serde_json::from_reader 取得读者的所有权?

error-handling - Rust 中有哪些不同的错误类型?