Списки и карты в JSON в Rust
Вектор при сборке становится массивом в квадратных скобках. Элементы идут в том же порядке, что и в векторе, а тип элементов задает вид каждой ячейки в строке.
Карта с ключом типа строка становится объектом: каждая пара ключ и значение превращается в поле объекта. Для других типов ключей нужен свой вид записи.
Запишем список пользователей и счетчики в одной структуре:
use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use serde_json;
#[derive(Serialize, Deserialize)]
struct User {
name: String,
age: i32,
}
#[derive(Serialize, Deserialize)]
struct Data {
users: Vec<User>,
meta: HashMap<String, i32>,
}
fn main() {
let data = Data {
users: vec![
User {
name: String::from("ann"),
age: 20,
},
User {
name: String::from("bob"),
age: 22,
},
],
meta: HashMap::from([
(String::from("a"), 1),
(String::from("b"), 2),
]),
};
match serde_json::to_string(&data) {
Ok(text) => println!("{}", text),
Err(_) => println!("error"),
}
}
В строке ключ "users" ведет к
массиву объектов, а "meta" к объекту
с числовыми значениями. Пустой вектор
дает [], пустая карта {}.
Разбор заполняет вектор и карту по строке:
use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use serde_json;
#[derive(Serialize, Deserialize)]
struct User {
name: String,
age: i32,
}
#[derive(Serialize, Deserialize)]
struct Data {
users: Vec<User>,
meta: HashMap<String, i32>,
}
fn main() {
let text = r#"{"users":[{"name":"x","age":1}],"meta":{"k":5}}"#;
match serde_json::from_str::<Data>(text) {
Ok(data) => println!("{} {}", data.users.len(), data.meta["k"]),
Err(_) => println!("error"),
}
}
Дана структура:
struct Pack {
ids: Vec<i32>,
}
Соберите строку для значения с одним
элементом 7 в векторе и выведите
ее.
Дана строка:
let text = r#"{"meta":{"x":1}}"#;
Разберите text в структуру Data
из урока и выведите значение по ключу
"x".
Дана структура:
struct Bad {
by_int: HashMap<i32, String>,
}
Скажите, соберется ли строка для заполненной карты с числовым ключом без своего вида.