У меня есть карта элементов, которые я хотел бы сериализовать в список структур, каждая из которых имеет поле для соответствующего ключа.
Представьте, что у вас есть такой файл YAML:
name_a:
some_field: 0
name_b:
some_field: 0
name_c:
some_field: 0
И соответствующая структура вроде этой:
struct Item {
name: String,
some_field: usize,
}
Я хотел бы десериализовать названные элементы в Vec<Item>
вместо Map<String, Item>
. Имена элементов (name_a
, ...) помещаются в поле name
объектов Item
.
Я пытался сделать следующее:
extern crate serde_yaml;
use std::fs::read_to_string;
let contents = read_to_string("file.yml").unwrap();
let items: Vec<Item> = serde_yaml::from_str(&contents).unwrap();
Однако это не работает и вызывает ошибку invalid type: map, expected a sequence
.
Я бы предпочел избегать создания переходного Map<String, PartialItem>
, который преобразуется в Vec
, и я бы также предпочел не реализовывать дополнительную структуру PartialItem
. Можно было бы использовать Option<String>
вместо name
, хотя я не думаю, что это оптимально.
name
? Должен ли он просто генерировать неверные данные? - person Shepmaster   schedule 02.11.2018Map<String, PartialItem>
, а затем преобразовал бы вVec<Item>
; Я полагаю, вы хотите избежать создания переходного процессаMap
? - person Shepmaster   schedule 02.11.2018PartialItem
. Для этого можно было бы использоватьOption<String>
в качестве имени, хотя я не думаю, что это оптимально. Может быть, переходныйMap
- это то, к чему я должен пойти, если лучшего варианта нет. - person Tim Visée   schedule 02.11.2018