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