如何使用“serde_json_core”在不分配的情况下反序列化数组?

Dan*_*Dan 5 rust serde

如何{"arr":[1,2,3,4]}在不使用或类似方法执行堆分配的情况下反序列化 JSON serde_json_core?它当前执行一次分配。我看到serde_json_core使用了heapless板条箱,但我不确定如何让它们一起工作。

#[derive(Deserialize)]
struct MyStruct {
    arr: Vec<u64>,
}

fn main() {
    let j = r#"{"arr":[1,2,3,4]}"#;

    let r: serde_json_core::de::Result<(MyStruct, usize)> = serde_json_core::from_str(j);
    let (out, _) = r.unwrap();

    println!("First value: {}.",  out.arr[0]);
}
Run Code Online (Sandbox Code Playgroud)

我在用serde_json_core = 0.4.0

Sve*_*ach 2

serde-json-core包可以将 JSON 数组反序列化为任何实现该Deserialize特征的类型。如果你想避免内存分配,你需要选择一个不分配的容器。

如果预先知道数组的大小,则可以简单地使用固定大小的数组,即[T; N]。如果 JSON 数组的大小不精确,这将返回反序列化错误N

如果 JSON 数组的大小是可变的且上限已知,则可以使用各种类似向量的堆栈分配数据结构之一。其中一个选项是heapless::VecDeserialize如果您启用 的serde功能,它就会实现heapless。在您的Cargo.yaml文件中,您可以这样做:

heapless = { version = "0.7", features = ["serde"] }
Run Code Online (Sandbox Code Playgroud)

如果您使用的版本heapless与您的版本所serde-json-core依赖的版本相同,则它只会包含在您的构建中一次。