Как избежать генерации JSON при сериализации значения NULL или значения по умолчанию? - PullRequest
0 голосов
/ 23 декабря 2018

Функция serde_json::to_string() сгенерирует строку, которая может включать null для Option<T> или 0 для u32.Это делает вывод больше, поэтому я хочу игнорировать эти виды значений.

Я хочу упростить вывод строки JSON следующей структуры:

use serde_derive::Serialize; // 1.0.82

#[derive(Serialize)]
pub struct WeightWithOptionGroup {
    pub group: Option<String>,
    pub proportion: u32,
}

Когда group равен None и proportion равно 0, строка JSON должна быть "{}"

Спасибо за ответ Как изменить реализацию по умолчанию в Serde для возврата пустого объекта вместо нуля? ,он может решить проблему Option, но для 0 решения не существует.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Есть несколько способов сделать это:

  • Пометьте каждое из полей атрибутом skip_serialising_if, чтобы указать, когда их пропустить.Это гораздо проще, но вы должны будете помнить, чтобы сделать это для каждого поля.
  • Напишите свой собственный Serial serialiser , который выполняет эту пользовательскую форму JSON.Это больше работы, но не должно быть слишком плохо, особенно если учесть, что вы все еще можете использовать стандартный десериализатор JSON.
0 голосов
/ 23 декабря 2018

Ссылка Пропустить поле сериализации Дайте мне ответ.

И фиксированный код:

#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Ord, PartialOrd, Eq)]
pub struct WeightWithOptionGroup {
    #[serde(skip_serializing_if = "Option::is_none")]
    #[serde(default)]
    pub group: Option<String>,
    #[serde(skip_serializing_if = "is_zero")]
    #[serde(default)]
    pub proportion: u32,
}

/// This is only used for serialize
#[allow(clippy::trivially_copy_pass_by_ref)]
fn is_zero(num: &u32) -> bool {
    *num == 0
}
...