我正在尝试生成如下所示的 json 对象
// final json output expected
{
"j1": {
"1981": {
"income": 215
},
"1982": {
"income": 350
},
},
"j2": {
"1981": {
"income": 100
},
"1982": {
"income": 215
},
}
}
我有以下代码
use serde_json::{Value, Map};
struct s {
name: String,
year: i32,
income: i64
}
fn main() {
let rows :Vec<s> = vec!(
s { name: "j1".to_string(), year: 1981, income: 100},
s { name: "j1".to_string(), year: 1981, income: 115},
s { name: "j1".to_string(), year: 1982, income: 120},
s { name: "j1".to_string(), year: 1982, income: 100},
s { name: "j1".to_string(), year: 1982, income: 130},
s { name: "j2".to_string(), year: 1981, income: 100},
s { name: "j2".to_string(), year: 1982, income: 120},
s { name: "j2".to_string(), year: 1982, income: 130}
);
let mut data_map: Map<String, Value> = Map::new();
for row in rows {
let mut name: &Map<String, Value> = match data_map.get(&row.name) {
Some(val) => { &val.as_object().unwrap() },
None => { &Map::new() }
};
let mut year: &Map<String, Value> = match data_map.get(&row.year.to_string()) {
Some(val) => { &val.as_object().unwrap() },
None => { &Map::new() }
};
let income: i64 = year.get("income").unwrap_or(&Value::Number(0i64.into())).as_i64().unwrap() + row.income;
year.insert("income".to_string(), Value::Number(income.into()));
}
}
我创建了这个代码来提问。我还咨询了 deepseek 等
我收到的错误消息是
error[E0596]: cannot borrow `*year` as mutable, as it is behind a `&` reference
--> src\main.rs:32:9
|
32 | year.insert("income".to_string(), Value::Number(income.into()));
| ^^^^ `year` is a `&` reference, so the data it refers to cannot be borrowed as mutable
|
help: consider changing this binding's type
|
27 | let mut year: &mut serde_json::Map<std::string::String, Value> = match data_map.get(&row.year.to_string()) {
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
显然我对引用和借用理解不足。如能得到任何帮助我将不胜感激。