我想使用rayon
并行反序列化json值。来自serde-json
示例的有效json在尝试在par_iter
内部进行反序列化时失败,尽管在没有并行化的情况下正确解析。这就是代码:
use rayon::prelude::*; // 1.7.0
use serde_json::{Result, Value};
fn main() -> Result<()> {
let data = r#"
{
"name": "John Doe",
"age": 43,
"phones": [
"+44 1234567",
"+44 2345678"
]
}"#;
let v: Value = serde_json::from_str(data)?;
println!("Please call {} at the number {}", v["name"], v["phones"][0]);
let mut batch = Vec::<String>::new();
batch.push(data.to_string());
batch.push(data.to_string());
let _values = batch.par_iter()
.for_each(|json: &String| {
serde_json::from_str(json.as_str()).unwrap()
});
Ok(())
}
字符串
这就是错误
thread 'thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value: Error("invalid type: map, expected unit", line: 2, column: 8)', src/main.rs:23:49
型
Link to the Playground.
IIRC,我见过其他在内部使用unwrap
的par_iter
示例。不推荐这样做吗?在我的例子中,我想这样做,因为我需要程序在输入无效时死机。
1条答案
按热度按时间eanckbw91#
serde_json::from_str
根据写入的变量类型自动确定其输出类型。但是,在您的示例中,for_each
不期望返回值,因此from_str
尝试将其反序列化为()
。将
map().collect()
与: Vec<Value>
注解一起使用可以实现以下功能:个字符
虽然说实话,使用
serde::Value
有点奇怪;通常人们会直接反序列化为一个结构体:的字符串