Rust遍历JSON时报错E0277:类型`[Value]`无法用`&str`索引如何解决
错误原因
profiles.as_array()返回的是Option<&Vec<Value>>类型,直接调用.iter()会遍历Option本身,你拿到的element实际是整个JSON数组的引用&Vec<Value>,不是数组内的单个对象元素,数组本身只能用usize类型索引,自然不能用字符串取字段。- 就算正确解包拿到数组,遍历到的单个元素为
serde_json::Value类型,需要确认是对象类型才能用字符串索引读取字段。
修复方案
方案一:最小改动修复现有代码
直接解包as_array()返回的Option,遍历数组内的元素即可:
fn main() { let profiles = get_profile().unwrap(); // 解包拿到数组引用后直接遍历元素 for element in profiles.as_array().unwrap() { println!("the value is: {}", element["age"]); } }
方案二:强类型实现(推荐)
动态Value类型容易触发运行时panic,建议定义匹配JSON结构的结构体,利用serde自动反序列化,编译期即可检查类型错误:
- 先修改
Cargo.toml添加serde派生特性:
[dependencies] serde = { version = "1.0", features = ["derive"] } serde_json = "1.0"
- 修改
main.rs代码:
use std::fs::File; use std::io::BufReader; use serde::Deserialize; use serde_json::Result as SResult; #[derive(Deserialize, Debug)] struct Profile { name: String, age: u32, achievement: Vec<f64>, } fn get_profile() -> SResult<Vec<Profile>> { let file = File::open("test2.json").expect("file should open read only"); let reader = BufReader::new(file); let v: Vec<Profile> = serde_json::from_reader(reader)?; Ok(v) } fn main() { let profiles = get_profile().unwrap(); for element in profiles { println!("the value is: {}", element.age); // 可直接安全访问其他字段,无运行时类型错误风险 println!("name: {}, achievement: {:?}", element.name, element.achievement); } }
内容的提问来源于stack exchange,提问作者zwl1619
相关产品推荐
相关产品推荐

