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

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?;

关键改动说明

  1. 兼容null:通过先反序列化为Option<&str>,直接处理API返回null的场景,避免类型转换错误。
  2. 解析转义字符串:当字段是有效字符串时,再尝试将其解析为Vec<String>,保持原逻辑中解析失败返回None的行为。

如果需要在解析转义字符串失败时返回错误而非None,可以将Err分支修改为:

Err(e) => Err(serde::de::Error::custom(format!("Failed to parse keywords: {}", e))),

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 10:20:24