使用 serde 反序列化编号的项目
Deserialize numbered items using serde
我正在尝试使用 serde 反序列化 JSON 如下所示的数据:
{
"item1": "Foo",
"item2": "Bar",
"item3": "Baz",
"item4": null,
"item5": null,
"description1": "something",
"description2": "another thing",
"description3": "one more thing",
"description4": null,
"description5": null
}
可以假定只有 5 个项目并且字段将始终存在(但可能为空)。
我希望将其放入 Vec<Item>
中
struct Item {
name: String,
description: String,
}
我知道我可以 #[derive(Deserialize)]
和别名名称字段,但我不确定如何处理将编号项目转换为列表。在 serde 中如何处理这样的情况?
考虑 serde_json::from_str 解析为 serde_json::Value
然后应用您的特定用例所需的转换。
#[derive(Debug)]
struct Item {
name: String,
description: String,
}
fn main() {
let data = r#"
{
"item1": "Foo",
"item2": "Bar",
"item4": null,
"item5": null,
"description1": "something",
"description2": "another thing",
"description3": "one more thing",
"description4": null,
"description5": null
}"#;
let v: Value = serde_json::from_str(data).unwrap();
let mut items = Vec::new();
for idx in 1..6 {
let name = format!("item{}", idx);
let descr = format!("description{}", idx);
if let (Value::String(value), Value::String(descr)) = (&v[name], &v[descr]) {
items.push(Item {
name: value.to_string(),
description: descr.to_string(),
})
}
}
println!("items {:?}", items);
}
我正在尝试使用 serde 反序列化 JSON 如下所示的数据:
{
"item1": "Foo",
"item2": "Bar",
"item3": "Baz",
"item4": null,
"item5": null,
"description1": "something",
"description2": "another thing",
"description3": "one more thing",
"description4": null,
"description5": null
}
可以假定只有 5 个项目并且字段将始终存在(但可能为空)。
我希望将其放入 Vec<Item>
中
struct Item {
name: String,
description: String,
}
我知道我可以 #[derive(Deserialize)]
和别名名称字段,但我不确定如何处理将编号项目转换为列表。在 serde 中如何处理这样的情况?
考虑 serde_json::from_str 解析为 serde_json::Value
然后应用您的特定用例所需的转换。
#[derive(Debug)]
struct Item {
name: String,
description: String,
}
fn main() {
let data = r#"
{
"item1": "Foo",
"item2": "Bar",
"item4": null,
"item5": null,
"description1": "something",
"description2": "another thing",
"description3": "one more thing",
"description4": null,
"description5": null
}"#;
let v: Value = serde_json::from_str(data).unwrap();
let mut items = Vec::new();
for idx in 1..6 {
let name = format!("item{}", idx);
let descr = format!("description{}", idx);
if let (Value::String(value), Value::String(descr)) = (&v[name], &v[descr]) {
items.push(Item {
name: value.to_string(),
description: descr.to_string(),
})
}
}
println!("items {:?}", items);
}