#iter #serde #serialization #streaming #no-std #no-alloc

no-std serde_deser_iter

通过迭代序列,允许在不反序列化到分配的集合的情况下聚合它们

1 个不稳定版本

0.1.0 2023年10月16日

#2107 in 编码

MIT/Apache

44KB
325

这个crate提供两种不同的方式在不分配的情况下反序列化序列。

示例

给定以下JSON

[
    {"id": 0, "name": "bob", "subscribed_to": ["rust", "knitting", "cooking"]},
    {"id": 1, "name": "toby 🐶", "subscribed_to": ["sticks", "tennis-balls"]},
    {"id": 2, "name": "alice", "subscribed_to": ["rust", "hiking", "paris"]},
    {"id": 3, "name": "mark", "subscribed_to": ["rust", "rugby", "doctor-who"]},
    {"id": 4, "name": "vera", "subscribed_to": ["rust", "mma", "philosophy"]}
]

我们可以这样处理它,而不需要分配一个大小为5的项向量

use serde_deser_iter::top_level::DeserializerExt;
# use std::{fs::File, io::BufReader, path::PathBuf, collections::HashSet};
#
/// The type each item in the sequence will be deserialized to.
#[derive(serde::Deserialize)]
struct DataEntry {
    // Not all fields are needed, but we could add "name"
    // and "id".
    subscribed_to: Vec<String>,
}

fn main() -> anyhow::Result<()> {
    #
    # let example_json_path: PathBuf = [env!("CARGO_MANIFEST_DIR"), "examples", "data.json"]
    #   .iter()
    #   .collect();
    let buffered_file: BufReader<File> = BufReader::new(File::open(example_json_path)?);
    let mut json_deserializer = serde_json::Deserializer::from_reader(buffered_file);
    let mut all_channels = HashSet::new();

    json_deserializer.for_each(|entry: DataEntry| all_channels.extend(entry.subscribed_to))?;
    println!("All existing channels:");
    for channel in all_channels {
        println!("  - {channel}")
    }
    Ok(())
}

顶级与深层

顶级

顶级模块提供了最用户友好的最强大的序列化序列方式。然而,它仅限于顶层定义的序列。例如,它可以处理以下JSON中的每个顶级元素

[
    {"name": "object1"},
    {"name": "object2"},
    {"name": "object3"}
]

但如果不在这个结构中,则不能工作

{
    "result": [
        {"name": "object1"},
        {"name": "object2"},
        {"name": "object3"}
    ]
}

深层

深层模块允许处理位于任何深度的序列(甚至嵌套的,尽管有些繁琐)。然而,它不允许在迭代项上运行闭包,只允许函数,并且其接口不如顶级直观。

依赖项

~110–350KB