gpt4 book ai didi

rust - 使用 serde 反序列化数组时跳过空对象

转载 作者:行者123 更新时间:2023-12-02 15:47:32 24 4
gpt4 key购买 nike

我需要反序列化类型为 Foo 的数组 (JSON) .我已经实现了它并且它适用于大多数东西,但我注意到最新版本的数据有时会包含错误的空对象。

在此更改之前,每个 Foo可以反序列化为以下枚举:

#[derive(Deserialize)]
#[serde(untagged)]
pub enum Foo<'s> {
Error {
// My current workaround is using Option<Cow<'s, str>>
error: Cow<'s, str>,
},
Value {
a: u32,
b: i32,
// etc.
}
}

/// Foo is part of a larger struct Bar.
#[derive(Deserialize)]
#[serde(untagged)]
pub struct Bar<'s> {
foos: Vec<Foo<'s>>,
// etc.
}

此结构可能表示以下 JSON 值之一:

// Valid inputs
[]
[{"a": 34, "b": -23},{"a": 33, "b": -2},{"a": 37, "b": 1}]
[{"error":"Unable to connect to network"}]
[{"a": 34, "b": -23},{"error":"Timeout"},{"a": 37, "b": 1}]

// Possible input for latest versions of data
[{},{},{},{},{},{},{"a": 34, "b": -23},{},{},{},{},{},{},{},{"error":"Timeout"},{},{},{},{},{},{}]

这种情况不会经常发生,但足以引起问题。通常,该数组应包含 3 个或更少的条目,但这些无关的空对象打破了该约定。我无法从解析 {} 中获得任何有意义的信息在最坏的情况下,一个阵列中可能有数百个。

我不想在解析时出错 {}因为数组仍然包含其他有意义的值,但我不想包括 {}在我解析的数据中。理想情况下,我也可以使用 tinyvec::ArrayVec<[Foo<'s>; 3]>而不是 Vec<Foo<'s>>以节省内存并减少配对期间执行分配所花费的时间,但由于这个问题我无法做到。

如何跳过{}使用 serde 反序列化数组时的 JSON 值在 Rust 中?

我还整理了一个 Rust Playground用一些测试用例来尝试不同的解决方案。

最佳答案

serde_with::VecSkipError提供一种方法来忽略反序列化失败的任何元素,方法是跳过它们。这将忽略任何错误,而不仅仅是空对象 {}。所以它可能过于宽容。

#[serde_with::serde_as]
#[derive(Deserialize)]
pub struct Bar<'s> {
#[serde_as(as = "serde_with::VecSkipError<_>")]
foos: Vec<Foo<'s>>,
}

Playground

关于rust - 使用 serde 反序列化数组时跳过空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73653433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com