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

Rust反序列化JSON时出现missing field `key`错误的解决求助

解决serde_json反序列化时的missing field key错误

错误根源

你遇到的Error("missing field key")本质是Redis返回的JSON结构与Data结构体定义完全不匹配:

  • Redis返回的JSON字段:change、data、token
  • Data结构体要求的必填字段:key、value、done

serde反序列化时会严格校验结构体的必填字段是否存在,缺少任意一个都会抛出此类错误。

解决方案

根据你的业务需求,有两种修正方向:

方向1:修正Redis存储的JSON格式

如果Data结构体的定义符合业务要求(必须包含key、value、done),需要将Redis中存储的JSON调整为匹配结构。例如:

{
  "key": "40:a3:cc:a3:dc:43",
  "value": [{"change":"new","token":"2a256356"}],
  "done": false
}

调整后反序列化就能直接匹配结构体字段。

方向2:修改Data结构体适配Redis返回格式

如果Redis返回的JSON是业务上的正确格式,需要调整结构体定义,通过serde属性处理字段映射、默认值等:

#[derive(Serialize, Deserialize, ToSchema, Clone)]
#[serde(crate = "rocket::serde")]
pub struct Data {
    /// 设备MAC地址,后续手动赋值
    pub key: String,
    /// 将Redis的`data`字段映射到结构体的`value`
    #[serde(rename = "data")]
    pub value: Vec<serde_json::Value>,
    /// 给`done`字段设置默认值(Redis返回中无此字段)
    #[serde(default)]
    pub done: bool,
    /// 新增Redis返回的`change`字段
    pub change: String,
    /// 新增Redis返回的`token`字段
    pub token: String,
}

同时在代码中手动给key赋值(你已经有传入的id参数):

pub fn get_user(id: String) -> Data  {
    let cache: RedisCache = RedisCache;

    let s: String = cache.get_str(&id).unwrap();
    println!("{}", &s);
    let mut user: Data = serde_json::from_str(&s).unwrap();
    // 直接使用传入的id作为key字段的值
    user.key = id;

    user
}

额外建议

  • 避免用unwrap()处理反序列化或Redis获取操作,改用match或?(若函数返回Result)捕获错误,方便排查问题:
    pub fn get_user(id: String) -> Result<Data, Box<dyn std::error::Error>> {
        let cache: RedisCache = RedisCache;
    
        let s = cache.get_str(&id)?;
        println!("{}", &s);
        let mut user: Data = serde_json::from_str(&s)?;
        user.key = id;
    
        Ok(user)
    }
    
  • 确认Value类型是serde_json::Value,避免因类型不匹配导致隐性错误
  • 检查#[serde(crate = "rocket::serde")]配置正确,rocket 0.5默认使用自身集成的serde,确保所有序列化/反序列化逻辑统一使用该crate

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:35:00