Вложенный объект в JSON в Rust
Поле с типом другой структуры при сборке становится вложенным объектом. Ключ внешнего уровня берут из имени поля, а внутри лежат ключи вложенной структуры по тем же правилам.
При разборе объект по ключу заполняет вложенную структуру целиком. Если внутренний объект опущен, поле остается нулевым значением типа.
Запишем человека с адресом:
use serde::{Deserialize, Serialize};
use serde_json;
#[derive(Serialize, Deserialize)]
struct Address {
city: String,
}
#[derive(Serialize, Deserialize)]
struct Person {
name: String,
addr: Address,
}
fn main() {
let person = Person {
name: String::from("ann"),
addr: Address {
city: String::from("oslo"),
},
};
match serde_json::to_string(&person) {
Ok(text) => println!("{}", text),
Err(_) => println!("error"),
}
}
На экране объект с ключом "addr"
и вложенным "city". Порядок ключей
в строке может отличаться, смысл тот же.
Разберем такой же вид строки обратно:
use serde::{Deserialize, Serialize};
use serde_json;
#[derive(Serialize, Deserialize)]
struct Address {
city: String,
}
#[derive(Serialize, Deserialize)]
struct Person {
name: String,
addr: Address,
}
fn main() {
let text = r#"{"name":"ann","addr":{"city":"oslo"}}"#;
match serde_json::from_str::<Person>(text) {
Ok(person) => println!("{}", person.addr.city),
Err(_) => println!("error"),
}
}
Даны типы:
struct Size {
w: i32,
h: i32,
}
struct Box {
label: String,
size: Size,
}
Подключите трейты, соберите строку для
коробки с подписью "a" и размером
2 на 3 и выведите ее.
Дана строка:
let text = r#"{"name":"bob","addr":{"city":"berlin"}}"#;
Используйте типы Person и
Address из урока, прочитайте
text и выведите город.
Дана структура:
struct Outer {
inner: Inner,
}
struct Inner {
val: i32,
}
Скажите, какой ключ появится у вложенного
объекта в строке при сборке Outer.