如何用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
相关产品推荐
相关产品推荐

