如何让serde在JSON含额外字段时抛出错误?附代码示例
让Serde在JSON包含额外字段时抛出错误
要让Serde在反序列化时遇到未定义的字段就报错,只需给目标结构体添加#[serde(deny_unknown_fields)]属性即可——这会启用Serde的严格反序列化模式,拒绝处理包含未知字段的JSON数据。
修改后的代码示例
#[derive(Debug, serde::Deserialize)] // 给顶层结构体C添加严格检查属性 #[serde(deny_unknown_fields)] struct C { a: A, b: B, } #[derive(Debug, serde::Deserialize)] // 如果需要检查A结构体的额外字段,也添加该属性 #[serde(deny_unknown_fields)] struct A { i: i32, } #[derive(Debug, serde::Deserialize)] // 如果需要检查B结构体的额外字段,同样添加该属性 #[serde(deny_unknown_fields)] struct B { f: f64, } fn main() { let json_string = r#" { "a": { "i": 32 }, "b": { "f": 3.4 }, "c": { "s": "ftree" } } "#; // 此时JSON中的额外字段"c"会触发反序列化错误 if let Ok(res) = serde_json::from_str::<C>(json_string) { println!("successfully parsed"); } else { println!("failed to parse due to unknown fields"); } }
说明
#[serde(deny_unknown_fields)]会告诉Serde:当反序列化时遇到结构体中未定义的字段,直接返回错误,而不是默认忽略它们。- 如果你只需要检查顶层结构体(比如C)的额外字段,仅给C添加该属性即可;如果嵌套结构体(A、B)也需要严格检查,就要给对应的结构体也加上这个属性。
运行修改后的代码,原JSON中的"c"字段会触发unknown field "c", expected "a" or "b"的错误,程序会执行else分支的逻辑。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

