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

如何使用Serde将含动态键的JSON反序列化为Vec<Price>

解决Serde处理动态键JSON转Vec的问题

你的JSON结构是动态字符串键映射到Price结构体,无法直接反序列化为Vec<Price>(因为JSON是对象类型,不是数组)。最简单的处理方式是先反序列化为HashMap<String, Price>,再提取其中的值转换为Vec。

步骤1:确保依赖正确

在Cargo.toml中添加Serde相关依赖:

[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

步骤2:完整代码实现

use serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[derive(Clone, Debug, Deserialize, Serialize)]
struct Price {
    pub price: f64,
    pub qty: f64,
}

fn main() {
    // 多条目JSON示例
    let multi_json = r#"{"Price 1":{"price":9.99,"qty":1.0}, "Price 2":{"price":8.99,"qty":10.0}, "Price 3":{"price":7.99,"qty":20.0}}"#;
    // 反序列化为HashMap
    let price_map: HashMap<String, Price> = serde_json::from_str(multi_json).unwrap();
    // 转换为Vec<Price>
    let price_vec: Vec<Price> = price_map.into_values().collect();
    println!("多条目结果: {:?}", price_vec);

    // 单条目JSON示例
    let single_json = r#"{"Price 1":{"price":9.99,"qty":1.0}}"#;
    let single_map: HashMap<String, Price> = serde_json::from_str(single_json).unwrap();
    let single_vec: Vec<Price> = single_map.into_values().collect();
    println!("单条目结果: {:?}", single_vec);

    // 空对象JSON示例
    let empty_json = r#"{}"#;
    let empty_map: HashMap<String, Price> = serde_json::from_str(empty_json).unwrap();
    let empty_vec: Vec<Price> = empty_map.into_values().collect();
    println!("空对象结果: {:?}", empty_vec);
}

原理说明

  • 动态键的JSON对象天然匹配HashMap<String, T>的结构,Serde可以自动完成反序列化。
  • into_values()方法会取出HashMap中所有的Price值,再通过collect()转换为Vec<Price>。
  • 空对象反序列化为空HashMap,最终会得到空的Vec,完全符合你的需求。

如果需要保留键的信息(比如"Price 1"这类标识),可以将结果转换为Vec<(String, Price)>,只需要把collect()的目标类型改成这个即可:

let price_with_keys: Vec<(String, Price)> = price_map.into_iter().collect();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:20:08