给定一个带有项目Map的yaml,
items:
item1:
uid: ab1234
foo: bar
item2:
uid: cd5678
foo: baz
字符串
如何使用serde将其解析为具有新字段“name”的Vec<Item>
,该字段从原始map的键生成,
struct Item {
name: String, // to be populated by the key (item1, item2)
uid: String,
foo: String,
}
型
我试图让下面的代码(rustexplorer)工作,目前错误与Err(Error("items: invalid type: map, expected a sequence", line: 3, column: 3))
。
/*
[dependencies]
serde = "1.0.193"
serde_derive = "1.0.193"
serde_yaml = "0.9.27"
*/
use serde_derive::{Deserialize, Serialize};
use std::vec::Vec;
#[derive(Debug, Serialize, Deserialize)]
struct Item {
name: String,
uid: String,
foo: String,
}
#[derive(Debug, Serialize, Deserialize)]
struct Schema {
items: Vec<Item>,
}
fn main() {
let input = r###"
items:
item1:
uid: ab1234
foo: bar
item2:
uid: cd5678
foo: baz
"###;
let items = serde_yaml::from_str::<Schema>(input);
println!("{:?}", items);
}
型
4条答案
按热度按时间suzh9iv81#
serde_with
有这样的东西:KeyValueMap
:字符串
57hvy0tb2#
您可以使用自定义的解析器和
Visitor
来完成此操作,而无需中间分配:字符串
Playground的
标签:https://serde.rs/stream-array.html
vnzz0bqm3#
虽然这肯定不是解决这个问题的最好的方法,但你可以将
tuple_vec_map
crate和一个自定义的函数组合起来:字符串
Explorer
5fjcxozz4#
你可以读入
String
->RawItem
(没有名字的项目)的临时Map,并将其转换为你需要的结构:字符串
上面的代码使用
indexmap::IndexMap
来保持顺序。如果你不关心顺序,你可以使用HashMap
。如果你选择IndexMap
,请注意,你需要打开indexmap
机箱的serde
功能。