无法使用带有serde-xml-rs的可选元素来解析XML

我有一棵带有Serde注释的结构树,它成功解析了示例XML,包括以下片段:

<bmsg>
    <cmsg>
         <!-- ... -->
    <cmsg>
<bmsg>

现在,我正在使用大型示例XML文件进行测试,并且以下结构失败,因为有时< cmsg> ..< / cmsg>不见了.我正在使用以下方法反序列化:

#[derive(Serialize,Deserialize, Debug)]
struct A {  
    #[serde(rename="bmsg")]
    messages: B,                 // <====
}

#[derive(Serialize,Deserialize, Debug)]
struct B {  // bmsg
    #[serde(rename="cmsg")]
    list: Vec<C>,
}

这导致第二个结构出错:

panicked at 'called `Result::unwrap()` on an `Err` value: missing field `cmsg`

我将第一个结构更改为具有Vec因此它可以处理可选元素:

#[derive(Serialize,Deserialize, Debug)]
struct A {  
    #[serde(rename="bmsg")]
    messages: Vec<B>,            // <====
}

#[derive(Serialize,Deserialize, Debug)]
struct B {  // bmsg
    #[serde(rename="cmsg")]
    list: Vec<C>,
}

但是serde继续给出相同的错误.我尝试了Option<>也是,但没有到达任何地方.

最让我感到困惑的是我使用了Vec.到处都没有碰到这个问题.

最佳答案
出现选项< T>.表示该项目确实存在,只是没有内容.

The documentation seems to suggest using的默认属性,告诉反序列化器在找不到类型时使用Default trait的实现.

考虑到这一点,也许这对您有用:

#[derive(Serialize,Deserialize, Debug)]
struct A {  
    #[serde(rename = "bmsg")]
    messages: B,
}

#[derive(Serialize,Deserialize, Debug)]
struct B {  // bmsg
    #[serde(rename = "cmsg", default)] // <----- use default to call `Default::default()` against this vector
    list: Vec<C>,
}

您可以找到the code I used to check this in the Playground.它不会在Playground中运行,但是会产生在本地运行的预期结果.

转载注明原文:无法使用带有serde-xml-rs的可选元素来解析XML - 代码日志