[英]Rust Serde: Deserialize XML directly to Vec<T>
我需要使用serde
来序列化一些 XML 数据。 数据有一个模式,其中复数形式的标签名称(例如 CATS、DOGS)将包含多个单数形式的标签子标签实例(CAT、DOG),如下所示:
<pets>
<cats>
<cat>
<name>
cat 1
</name>
</cat>
<cat>
<name>
cat 2
</name>
</cat>
</cats>
<dogs>
<dog>
<name>
dog 1
</name>
</dog>
<dog>
<name>
dog 2
</name>
</dog>
</dogs>
</pets>
现在,我可以使用serde
和serde-xml-rs
反序列化它:
use serde::{Serialize, Deserialize};
use serde_xml_rs;
#[derive(Debug, Serialize, Deserialize)]
struct Pets {
pub cats: Cats,
pub dogs: Dogs,
}
#[derive(Debug, Serialize, Deserialize)]
struct Cats {
pub cat: Vec<Cat>,
}
#[derive(Debug, Serialize, Deserialize)]
struct Dogs {
pub dog: Vec<Dog>,
}
#[derive(Debug, Serialize, Deserialize)]
struct Cat {
name: String,
}
#[derive(Debug, Serialize, Deserialize)]
struct Dog {
name: String,
}
fn main() {
let s = xml_string_from_above;
let pets: Pets = serde_xml_rs::from_str(s).unwrap();
println!("{:#?}", pets);
}
问题:我可以使用一些 serde hack 来删除中间结构Cats
和Dogs
并简单地获取向量中的多个实例吗?
#[derive(Debug, Serialize, Deserialize)]
struct SlimmedPets {
pub cats: Vec<Cat>,
pub dogs: Vec<Dog>,
}
在序列化SlimmedPets
结构时仍然得到相同的 XML ?
如果您的目标是避免写下像这个问题这样的中间结构,我认为没有一个好的方法可以做到这一点。
如果您的目标是从反序列化中获得与用于生成反序列化器的结构不同的结构,则可以使用serde(from = "…",
and into = "…")
属性。
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(from = "Pets", into = "Pets")]
struct SlimmedPets {
pub cats: Vec<Cat>,
pub dogs: Vec<Dog>,
}
impl Into<Pets> for SlimmedPets {
fn into(self) -> Pets {
Pets {
cats: Cats { cat: self.cats },
dogs: Dogs { dog: self.dogs },
}
}
}
impl From<Pets> for SlimmedPets {
fn from(from: Pets) -> Self {
SlimmedPets {
cats: from.cats.cat,
dogs: from.dogs.dog,
}
}
}
let pets: SlimmedPets = serde_xml_rs::from_str(xml_string_from_above).unwrap();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.