【问题标题】:Serde skip field serialization depending on a "global" runtime conditionSerde 跳过字段序列化取决于“全局”运行时条件
【发布时间】:2021-10-06 15:42:29
【问题描述】:

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

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

如果条件是序列化,即使字段的值为 None,也要这样做(即在输出 JSON 中显式创建具有 null 值的属性)。

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

【问题讨论】:

  • 如何提供“全局”运行时条件?像执行时的参数?
  • 您应该可以使用skip_serializing_if。您只需忽略参数值并访问您的运行时条件(如文件、全局变量)。
  • 我更新了我的问题并添加了一个示例。

标签: rust serde


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2022-11-10
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多