【发布时间】:2019-07-25 21:29:35
【问题描述】:
如何反序列化可能具有不同子级的 API 返回的 XML 字符串(使用 serde 派生)?
如果我调用 API,它可能会返回以下结果集之一:
use serde::Deserialize;
use serde_xml_rs::from_str;
#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
struct Error {
code: u32,
message: String,
}
#[derive(Debug, Deserialize)]
struct Item {
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
struct DataSet {
error: Option<Error>,
data: Option<Vec<Item>>
}
fn main() {
let error = r#"
<DataSet>
<Error>
<Code>0</Code>
<Message>error</Message>
</Error>
</DataSet>
"#;
let dataset: DataSet = from_str(error).unwrap();
println!("{:#?}", dataset);
let items = r#"
<DataSet>
<Item>..</Item>
<Item>..</Item>
</DataSet>
"#;
let dataset: DataSet = from_str(items).unwrap();
println!("{:#?}", dataset);
}
[package]
name = "dataset"
version = "0.1.0"
edition = "2018"
[dependencies]
serde = { version = "1", features = ["derive"] }
serde-xml-rs = "0.3"
但我觉得应该有一种更惯用的方式来实现这一点。特别是因为它会使匹配数据变得更加容易。
我尝试使用#[serde(flatten)],并尝试将ApiResponse 设置为元组结构和具有单个元组参数的结构。没有运气。
这是否可能无需构建自定义反序列化器?
【问题讨论】:
-
答案很简单但是
serde-xml-rs有bugs
标签: rust deserialization serde