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

如何用serde_json实现字段需为整数/Null且不可缺失的反序列化?

解决方案

要实现parent_id字段必须存在(可接受整数或null)、缺失时返回错误的需求,只需给结构体的parent_id字段添加#[serde(required)]属性即可。默认的Option<T>会在字段缺失时自动转为None,而#[serde(required)]会强制要求JSON中必须包含该字段,同时保留Option<T>对null和有效值的处理能力。

修改后的代码示例

use serde::{Deserialize, Serialize};
use serde_json;

#[derive(Debug, Serialize, Deserialize)]
pub struct Group {
    pub name: String,
    #[serde(required)]
    pub parent_id: Option<i32>,
}

fn main() -> Result<(), serde_json::Error> {
    // 合法场景:parent_id为null
    let group_null: Group = serde_json::from_value(serde_json::json!({
        "name": "Group 1",
        "parent_id": null
    }))?;
    println!("{:?}", group_null); // 输出:Group { name: "Group 1", parent_id: None }

    // 合法场景:parent_id为整数
    let group_int: Group = serde_json::from_value(serde_json::json!({
        "name": "Group 2",
        "parent_id": 10
    }))?;
    println!("{:?}", group_int); // 输出:Group { name: "Group 2", parent_id: Some(10) }

    // 非法场景:parent_id缺失,反序列化失败
    let result = serde_json::from_value(serde_json::json!({
        "name": "Group 3"
    }));
    assert!(result.is_err());
    println!("错误信息:{}", result.err().unwrap());

    Ok(())
}

关键说明

  • #[serde(required)]:强制JSON中必须包含对应字段,缺失时直接返回反序列化错误。
  • Option<i32>:保留对null(转为None)和整数(转为Some(i32))的兼容处理。

依赖配置

确保Cargo.toml中包含正确的依赖版本:

[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

内容的提问来源于stack exchange,提问作者Patrick Chin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:25:00