如何使用 `serde_json_core` 反序列化没有分配的数组?

How do I use `serde_json_core` to deserialise an array without allocations?

如何在不使用 serde_json_core 或类似方法执行堆分配的情况下反序列化 JSON {"arr":[1,2,3,4]}?它当前执行一次分配。我看到 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]);
}

我正在使用 serde_json_core = 0.4.0

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

如果事先知道数组的大小,可以简单地使用固定大小的数组,即[T; N]。如果 JSON 数组的大小不完全 N.

,这将 return 一个反序列化错误

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

heapless = { version = "0.7", features = ["serde"] }

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