Rust:如何将转义JSON字符串反序列化为Option<Vec<String>>
解决Rust中转义JSON字符串与null共存的反序列化问题
你的问题出在自定义反序列化器没有处理keywords字段为null的场景——当前代码直接尝试把输入反序列化为&str,但null无法转换为字符串类型,因此触发报错。
修改后的解决方案
调整自定义反序列化器,先处理null情况,再解析转义的JSON字符串:
use serde::{Deserialize, Deserializer}; use serde_json; fn deserialize_keywords<'de, D>(deserializer: D) -> Result<Option<Vec<String>>, D::Error> where D: Deserializer<'de>, { // 先将输入反序列化为 Option<&str>,兼容 null 和字符串两种情况 let opt_str = Option::<&str>::deserialize(deserializer)?; match opt_str { Some(s) => { // 尝试将转义字符串解析为 Vec<String> match serde_json::from_str(s) { Ok(keywords) => Ok(Some(keywords)), Err(_) => Ok(None), // 解析失败时返回 None,可根据需求改为返回错误 } } None => Ok(None), // 字段为 null 时直接返回 None } } #[derive(Debug, Serialize, Deserialize)] pub struct ItemProperties { id: String, description: Option<String>, #[serde(deserialize_with = "deserialize_keywords")] keywords: Option<Vec<String>>, #[serde(alias = "createdate")] created_date: String, } #[derive(Debug, Serialize, Deserialize)] pub struct Item { pub id: String, pub properties: ItemProperties, #[serde(alias = "createdAt")] pub created_at: String, #[serde(alias = "updatedAt")] pub updated_at: String, } #[derive(Deserialize)] struct TypeResponse { results: Vec<Item>, total: usize, } // 请求代码保持不变 // let response = self.client.post("https://api.com/items") // .send() // .await? // .json::<TypeResponse>() // .await?;
关键改动说明
- 兼容null:通过先反序列化为
Option<&str>,直接处理API返回null的场景,避免类型转换错误。 - 解析转义字符串:当字段是有效字符串时,再尝试将其解析为
Vec<String>,保持原逻辑中解析失败返回None的行为。
如果需要在解析转义字符串失败时返回错误而非None,可以将Err分支修改为:
Err(e) => Err(serde::de::Error::custom(format!("Failed to parse keywords: {}", e))),
内容的提问来源于stack exchange,提问作者fingerprints
相关产品推荐
相关产品推荐

