Rust - как работать с serde_json::Value?

В Serde можно после парсинга json получить данные без укащания типа (serde_json::Value) и типизированные данные (через структуру). Получаю так:

let v: Value = serde_json::from_str(&response_body).unwrap();
let data = &v["arr"]["name"];

Если посмотреть на них, то увидим:

Array [String("name1"), String("name2")]

Если пытаться читать его в цикле, то выдается

&Value` is not an iterator

Как с этого типа получить все значения для дальнейшей работы с ними в цикле (в данном случае name1, name2)? Вроде их можно в MAP реэкспоритровать?


Ответы (1 шт):

Автор решения: Kalashnikov Alexander

Хотелось бы конечно знать, что автор хочет извлечь из json… Но например, serde_json::Value имеет набор методов as_bool, as_u64, as_f64, as_str, as_array, as_object. А также их _mut варианты, кроме того можно проверить вариант Value методами is_null, is_bool, is_number, is_string, is_array, is_object. Пример по просьбе из комментариев.

if let Some(names) = v["arr"]["name"].as_array() {
  let names_as_str: Vec<&str> = names.iter()
    .filter_map(|name| name.as_str())
    .collect();
  println!("Now names are a Vec of str slices {:?}", names_as_str); 
}

можно если есть уверенность, что там точно array:

let names_as_str: Vec<&str> = v["arr"]["name"]
  .as_array()
  .unwrap()
  .iter()
  .filter_map(|name| name.as_str())
  .collect();
→ Ссылка