При обходе json в Rust возникает ошибка

#rust

Вопрос:

тест2.json

 [  {"name":"Lucy","age":18,"achievement":[95,86.5,90]},  {"name":"Lily","age":19,"achievement":[92.5,89,91]},  {"name":"Jack","age":20,"achievement":[93,90,93.5]} ]  

main.rs

 use std::fs::File; use std::io::BufReader; use serde_json::{Result as SResult, Value};  fn get_profile() -gt; SResultlt;Valuegt; {  let file = File::open("test2.json").expect("file should open read only");  let reader = BufReader::new(file);  let mut v: Value = serde_json::from_reader(reader)?;  Ok(v.take()) }  fn main() {  let profiles = get_profile().unwrap();   for element in profiles.as_array().iter() {  println!("the value is: {}", element["age"]);  } }  

ошибка:

 λ cargo run  Compiling hello-rust v0.1.0 (D:workspacerust-projectshello-rust) error[E0277]: the type `[Value]` cannot be indexed by `amp;str`  --gt; srcmain.rs:20:38  | 20 | println!("the value is: {}", element["age"]);  | ^^^^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`  |  = help: the trait `SliceIndexlt;[Value]gt;` is not implemented for `amp;str`  = note: required because of the requirements on the impl of `std::ops::Indexlt;amp;strgt;` for `Veclt;Valuegt;`  For more information about this error, try `rustc --explain E0277`. error: could not compile `hello-rust` due to previous error  

Как устранить эту проблему? Любая помощь, пожалуйста, спасибо.

Комментарии:

1. Я немного заржавел от своей ржавчины (каламбур), но, похоже, проблема в том, что это каким-то element образом массив Value s, а не просто Value

Ответ №1:

Ты звонишь .iter() ан Optionlt;amp;Veclt;Valuegt;gt; . Итератор выдает одно значение, если параметр является Некоторым, в противном случае нет.

Вместо этого вы можете изменить свой цикл на этот, что даст по одному Value (здесь объект) за раз:

 for element in profiles.as_array().unwrap().iter() {  println!("the value is: {}", element["age"]); }  

Примечание: Я бы, по крайней мере, использовал is_array() etc. для проверки структуры и улучшения обработки ошибок (не только unwrap() . Вы получаете многое бесплатно при использовании структур и Deserialize вместо того, чтобы разбирать все вручную.

Пример:

 #[derive(Deserialize)]  struct Profile {  name: String,  age: usize,  achievement: Veclt;f64gt;,  }   let profiles: Veclt;Profilegt; =  serde_json::from_reader(BufReader::new(File::open("test2.json").unwrap())).unwrap();  for profile in profiles {  println!("the value is: {}", profile.age);  }