无法使用带有 serde-xml-rs 的可选元素解析 XML
Failed to parse XML with an optional element with serde-xml-rs
我有一棵带 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<>
而从来没有 运行 进入这个问题。
看起来Option<T>
表示该项目确实存在,只是没有内容。
The documentation seems to suggest using the default
attribute, to tell the deserializer to use the implementation of the 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 中 运行,但会在本地 运行ning 产生您预期的结果。
我有一棵带 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<>
而从来没有 运行 进入这个问题。
看起来Option<T>
表示该项目确实存在,只是没有内容。
The documentation seems to suggest using the default
attribute, to tell the deserializer to use the implementation of the 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 中 运行,但会在本地 运行ning 产生您预期的结果。