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

