首页 > 解决方案 > 如何在没有中间结构的情况下有效地将 JSON 的一部分提取为 Vec?

问题描述

我有 JSON 内容,其中嵌套很深,有一组我想提取的数字。我不想创建中间结构,所以我尝试了以下方法:

... get f
let json = serde_json::from_reader::<_, serde_json::Value>(f)?;
let xs: Vec<(f64, f64)> = serde_json::from_value(json["subtree"][0])?;

这抱怨

11 | serde_json::from_value(json["subtree"][0])?;
   |                        ^^^^^^^^^^^^^^^^^^^^^ move occurs because value has type `serde_json::value::Value`, which does not implement the `Copy` trait

如果我clone,它工作正常:

let xs: Vec<(f64, f64)> = serde_json::from_value(json["subtree"][0].clone())?;

但这似乎没有必要。我不会使用结构的其余部分。如何在无需创建中间结构且无需克隆的情况下实现这一目标?

标签: jsonrustserdeserde-json

解决方案


哦,错过了完全明显的。

... get f
let mut json = serde_json::from_reader::<_, serde_json::Value>(f)?;
let xs: Vec<(f64, f64)> = serde_json::from_value(json["subtree"][0].take())?;

推荐阅读