Я думаю, что в этом случае я бы определил выделенное struct Person
, и пусть serde
выполняет тяжелую работу:
use serde_json; // 1.0.48
use serde; // 1.0.104
use serde::Deserialize;
use std::collections::HashSet;
#[derive(Deserialize)]
struct Person {
name: String,
age: usize,
}
fn main() {
let my_json_list = vec!(
"{\"name\":\"Tim\", \"age\":18}",
"{\"name\":\"Alex\", \"age\":25}"
);
let my_hash_set : HashSet<String> = my_json_list
.iter()
.filter_map(|str| serde_json::from_str::<Person>(str)
.ok() // convert Result -> Option
.map(|person| person.name) // only interested in name
)
.collect(); // collect names into HashSet
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=607cfe125b5690fb89b23ca904da31cc
Если вы предпочитаете более ad-ho c решение без структуры: используйте serde_json; // 1.0.48
use std::collections::HashSet;
fn main() {
let my_json_list = vec!(
"{\"name\":\"Tim\", \"age\":18}",
"{\"name\":\"Alex\", \"age\":25}"
);
let my_hash_set : HashSet<String> = my_json_list
.iter()
.filter_map(|str| serde_json::from_str::<serde_json::Value>(str)
.ok() // convert Result -> Option
.and_then(|json_val| json_val.get("name")
.and_then(|name_val| name_val.as_str()) // try to convert to &str
.map(|str| str.to_string()) // convert &str to String
)
)
.collect(); // collect names into HashSet
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=607cfe125b5690fb89b23ca904da31cc