Пустое необязательное поле в JSON в Rust
Поле типа необязательного значения может
отсутствовать в объекте. При сборке
вариант None часто все равно дает
ключ со значением null, если ничего
не настроить.
Атрибут над полем просит пропустить ключ,
когда вариант пуст. Запись
#[serde(skip_serializing_if = "Option::is_none")]
сравнивает поле с None и не включает
его в строку, если значения нет.
Сравним запись с заметкой и без нее:
use serde::{Deserialize, Serialize};
use serde_json;
#[derive(Serialize, Deserialize)]
struct Item {
title: String,
#[serde(skip_serializing_if = "Option::is_none")]
note: Option<String>,
}
fn main() {
let with_note = Item {
title: String::from("go"),
note: Some(String::from("ok")),
};
let empty_note = Item {
title: String::from("go"),
note: None,
};
match serde_json::to_string(&with_note) {
Ok(text) => println!("{}", text),
Err(_) => println!("error"),
}
match serde_json::to_string(&empty_note) {
Ok(text) => println!("{}", text),
Err(_) => println!("error"),
}
}
Первая строка содержит "note",
во второй ключа "note" нет.
Поле title остается в обеих строках.
Тот же флаг работает для числа внутри необязательного поля:
use serde::{Deserialize, Serialize};
use serde_json;
#[derive(Serialize, Deserialize)]
struct Score {
name: String,
#[serde(skip_serializing_if = "Option::is_none")]
bonus: Option<i32>,
}
fn main() {
let score = Score {
name: String::from("ann"),
bonus: None,
};
match serde_json::to_string(&score) {
Ok(text) => println!("{}", text),
Err(_) => println!("error"),
}
}
Дана структура:
struct Row {
code: i32,
flag: Option<bool>,
}
Добавьте пропуск пустого варианта для
flag, соберите строку для кода
1 и None в флаге и скажите,
будет ли ключ "flag".
Дана структура:
struct Bag {
tags: Option<Vec<String>>,
}
Настройте пропуск для tags,
соберите строку для None и
скажите, появится ли ключ "tags".
Дана структура:
struct Pair {
left: Option<i32>,
right: i32,
}
При сборке значения с пустым left
и right равным 5 перечислите
ключи, которые останутся в строке, если
для left включен пропуск.