Serde пропускает сериализацию полей в зависимости от «глобального» условия выполнения

#rust #serde

Вопрос:

В зависимости от некоторых условий выполнения я хотел бы либо сериализовать поле, либо нет. Это условие применимо ко всей сериализации и не имеет ничего общего со значением самого поля. Следовательно, я не могу использовать skip_serializing_if() , если я правильно понимаю, если только я не использую какое-то глобальное состояние, но тогда это было бы больше похоже на константу, а не на «условие».

В качестве примера предположим, что условие зависит от клиента, который запросил файл. Некоторым клиентам потребуется это поле, другим — нет.

Если условие говорит сериализовать, сделайте это, даже если значение поля равно None (т. Е. Явно создайте свойство со null значением в выходном JSON).

Каков самый простой и чистый способ достичь этого?

Комментарии:

1. Как обеспечивается это «глобальное» условие выполнения? Как параметр при выполнении?

2. Вы должны уметь пользоваться skip_serializing_if . Вы просто игнорируете значение аргумента и вместо этого получаете доступ к своему условию выполнения (например, файлу, глобальной переменной).

3. Я обновил свой вопрос и добавил пример.

Ответ №1:

Просто создайте функцию и проигнорируйте аргумент:

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

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

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

fn main() {
    println!("{}", serde_json::to_string(amp;Foo{data: None}).unwrap());
}
 

Игровая площадка