Error handling 如何使用Serde解析可能无法反序列化的字段,而不会导致整个反序列化失败?

Error handling 如何使用Serde解析可能无法反序列化的字段,而不会导致整个反序列化失败?,error-handling,rust,deserialization,serde,Error Handling,Rust,Deserialization,Serde,我正在反序列化一些作为请求传入的JSON对象。输入主体是嵌套的,但由于各种原因,某个字段有时会格式错误。在这种情况下,我仍然想要对象的其余部分。这并不都必须通过serde完成;但是现在发生的事情是,如果一个子字段出错,整个请求就会被破坏。我想以某种方式对结果进行反序列化,并将字段标记为errored out。如何做到这一点 例如,数据模式可能如下所示: struct BigNested { a: Vec<A>, b: B, // definition omitted

我正在反序列化一些作为请求传入的JSON对象。输入主体是嵌套的,但由于各种原因,某个字段有时会格式错误。在这种情况下,我仍然想要对象的其余部分。这并不都必须通过serde完成;但是现在发生的事情是,如果一个子字段出错,整个请求就会被破坏。我想以某种方式对结果进行反序列化,并将字段标记为errored out。如何做到这一点

例如,数据模式可能如下所示:

struct BigNested {
    a: Vec<A>,
    b: B, // definition omitted
}

struct A {
    keep_this: Foo,
    trouble: SometimesBad,
}
struct-BigNested{
a:Vec,
b:b,//省略了定义
}
结构A{
留着这个:福,
麻烦:有时很糟糕,
}
麻烦
是经常出现混乱的领域。我很乐意(例如)将
故障
转化为
结果
,并从那里进行处理,但我不知道如何让serde让我这么做

某些字段有时格式错误

你没有说传入的JSON格式有多不正确。假设它仍然是有效的JSON,您可以通过自定义反序列化来实现这一点:

  • 定制的反序列化以一种对有效JSON输入永不失败的方式完成,尽管如果输入具有意外的格式,它可能不会返回预期类型的值

  • 但这些意想不到的领域仍然需要去某个地方。Serde的struct
    flatte
    在这里很方便,因为任何JSON片段都可以反序列化为
    HashMap

/#serde={version=“1.0.103”,功能=[“派生”]}
//#serde_json=“1.0.44”
使用serde::{Deserialize,Deserializer,de::DeserializeOwned};
使用serde_json::Value;
使用std::collections::HashMap;
#[派生(反序列化、调试)]
结构A{
留着这个:福,
麻烦:有时很糟糕,
}
#[派生(反序列化、调试)]
结构Foo{
foo:i32,
}
#[派生(反序列化、调试)]
结构有时坏{
内:锥虫,
#[serde(展平)]
黑洞:HashMap,
}
#[派生(反序列化、调试)]
结构条{
酒吧:字符串,
}
#[导出(调试)]
锥虫{
解析(T),
未解析(值),
不在场
}
胰蛋白酶抑制剂{

fn反序列化你读过吗?@Shepmaster我以前没有看到过这个答案,但我已经阅读了相关文档一段时间了(包括带有
属性的反序列化_)然而,当我阅读相关文档时,我最终写了这么多代码,觉得一定有一种更简单的方法。写了这么多代码,觉得一定有一种更简单的方法——链接的问题是否说明了这一点?(TL;DR:您可以使用
序列化
反序列化
的中间自动实现)@Shepmaster我想我是这样做的,但是问题似乎是serde的反序列化器的模型。我可以使用一个自定义类型将错误数据正确反序列化。但是,传入的
反序列化器
对象似乎“中毒”--它记住它遇到了一个错误,任何进一步使用它的尝试都只会返回相同的错误;它无法理解关联的坏对象已经结束,它应该继续尝试。(续)我怀疑问题是,这是一个旧问题(2016)为解决此问题而打开,特别是为了解决此问题,但它似乎没有这样做就关闭了。