作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有 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 default
属性,告诉反序列化器使用 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 中运行,但会产生您在本地运行的预期结果。
关于xml - 无法使用 serde-xml-rs 解析带有可选元素的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46674893/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!