You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:14:55