【问题标题】:Deserialize XML with multiple schema structures使用多个模式结构反序列化 XML
【发布时间】: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-rsbugs

标签: rust deserialization serde


【解决方案1】:

看看serde examples 的一些内容,这可能会对您有所帮助。特别是未标记枚举上的示例/文档,它们允许您定义许多反序列化为单个枚举类型的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多