#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); }