1 个不稳定版本
0.1.0 | 2023年10月16日 |
---|
#2107 in 编码
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