使用serde_with的double_option反序列化JSON遇类型不匹配错误求解
问题原因
错误出在title字段:你给它配置了serde_with::rust::double_option适配器,但字段类型是Option<String>,而double_option适配器要求字段类型必须是Option<Option<T>>——适配器会生成Option<Option<String>>类型的数据,但字段只能接收Option<String>,因此触发类型不匹配。
double_option的作用是区分三种状态:字段完全缺失(外层None)、字段存在但值为null(内层None)、字段存在且有有效值(内层Some(T)),因此必须搭配双层Option类型使用。
解决方案
有两种修正方式,根据你的业务需求选择:
方案1:统一字段类型(保留双层Option语义)
把title字段的类型改成Option<Option<String>>,和另外两个字段保持一致:
#[derive(Deserialize, Debug)] pub struct UpdatePartialTask { #[serde( default, // deserialization skip_serializing_if = "Option::is_none",// serialization with = "::serde_with::rust::double_option", )] pub priority: Option<Option<String>>, #[serde( default,// deserialization skip_serializing_if = "Option::is_none",// serialization with = "::serde_with::rust::double_option", )] pub user_id: Option<Option<i32>>, #[serde( default,// deserialization skip_serializing_if = "Option::is_none",//serialization with = "::serde_with::rust::double_option", )] pub title: Option<Option<String>>, // 修正类型为双层Option }
方案2:移除不必要的适配器(仅保留普通Option语义)
如果title不需要区分“字段缺失”和“字段为null”两种情况,直接移除double_option适配器即可:
#[derive(Deserialize, Debug)] pub struct UpdatePartialTask { #[serde( default, // deserialization skip_serializing_if = "Option::is_none",// serialization with = "::serde_with::rust::double_option", )] pub priority: Option<Option<String>>, #[serde( default,// deserialization skip_serializing_if = "Option::is_none",// serialization with = "::serde_with::rust::double_option", )] pub user_id: Option<Option<i32>>, #[serde( default,// deserialization skip_serializing_if = "Option::is_none",//serialization // 移除double_option适配器 )] pub title: Option<String>, }
内容的提问来源于stack exchange,提问作者Russo
相关产品推荐
相关产品推荐

