我正在尝试从JSON数据创建一个petgraph
Graph
。JSON包含图的边缘,键表示起始顶点,值是相邻顶点的列表。可以使用边缘向量生成图形。我成功地创建了Vec<(String, String))>
,但不是预期的Vec<(&str, &str)>
。extern crate petgraph;
extern crate serde_json;
use petgraph::prelude::*;
use serde_json::{Value, Error};
fn main() {
let data = r#"{
"A": [ "B" ],
"B": [ "C", "D" ],
"D": [ "E", "F" ]
}"#;
let json_value: Value = serde_json::from_str(data).unwrap();
let mut edges: Vec<(String, String)> = vec![];
if let Value::Object(map) = json_value {
for (from_edge, array) in &map {
if let &Value::Array(ref array_value) = array {
for edge in array_value {
if let &Value::String(ref to_edge) = edge {
edges.push((from_edge.clone(), to_edge.clone()))
}
}
}
}
}
// let graph = DiGraphMap::<&str, ()>::from_edges(edges);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct
// `std::string::String`, found &str
}
我尝试了不同的方法:
- 将图形类型更改为
DiGraphMap ::<String,()>
,但它不接受。 - 将
Vec<(String,String)>
转换为Vec<(&str,&str)>
。我阅读了this post,但没有帮助。 edges.push((&"a",&"b"))
可以工作,但edges.push((&from.clone(),&to.clone()))
不行。
这里可能有更好的提取边缘的方法。
fn from_json(json_str: &str) -> Result<DiGraphMap<&str, ()>, Error>
,但是我得到了json_value
的生命周期不够长的错误。 - L. Meyer