使用serde_json将JSON对象转换为HashMap

7
我将尝试使用 serde_json 在 Rust 中将 JSON 对象解析为 HashMap。但是,使用以下代码时,我会收到错误提示:
error[E0507]: cannot move out of index of `Value`

我该如何将那个Value放入我的HashMap中呢?

use serde_json::{Result, Value};
use std::collections::HashMap;

fn main() {

  let variables_json = r#"{
    "awayTeamAbbrev": "DAL",
    "homeTeamAbbrev": "TB",
    "gameInstanceUid": "cbs-nfl-pickem-challenge",
    "sportType": "NFL",
    "weekNumber": 1
  }"#;
  let keys = vec!["sportType","weekNumber"];
  dbg!(json_to_hashmap(&variables_json, keys));
    
}  

fn json_to_hashmap(json: &str, keys: Vec<&str>) -> Result<HashMap<String, Value>> {
    let lookup: Value = serde_json::from_str(json).unwrap();
    let mut map = HashMap::new();
    for key in keys {
        let varname = key.to_owned();
        let value = lookup[&varname];
        map.insert(varname, value);
    }
    Ok(map)

}

你可以使用 let value = lookup[&varname].clone(); 来创建一个值的克隆,以避免移动。 - Joe_Jingyu
@Joe_Jingyu 那个有效了,谢谢! - Kit Peters
1个回答

10

你可以直接从serde_json::from_str获取一个HashMap<String, Value>,然后使用remove_entry来取出值而无需克隆:

fn json_to_hashmap(json: &str, keys: Vec<&str>) -> Result<HashMap<String, Value>> {
    let mut lookup: HashMap<String, Value> = serde_json::from_str(json).unwrap();
    let mut map = HashMap::new();
    for key in keys {
        let (k, v) = lookup.remove_entry (key).unwrap();
        map.insert(k, v);
    }
    Ok(map)
}

游乐场


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接