3个不稳定版本
0.2.0 | 2023年11月10日 |
---|---|
0.1.1 | 2023年11月7日 |
0.1.0 | 2023年11月6日 |
#2751 in 解析实现
28 每月下载次数
36KB
914 行
Spanned Json Parser
这个crate是一个json解析器,它将为值返回跨度信息,这意味着行号和列号。它还与serde兼容,因此您可以将其序列化到任何实现Deserialize的其他结构中
为什么使用它?
主要用例之一是在解析后进行验证。通过拥有行和列号,您可以非常精确地告诉用户值在哪里无效
如何使用它?
这个crate公开了一个类似于serde的Value
,并将所有内容都包装在这个结构中
pub struct Position {
pub col: usize,
pub line: usize,
}
pub struct SpannedValue {
pub value: Value,
pub start: Position,
pub end: Position,
}
解析
use spanned_json_parse::parse;
use std::fs;
fn main() {
let json = fs::read_to_string(path).unwrap();
let parsed = parse(&json);
println!("Parsed: {:#?}", parsed);
}
在结构中序列化
use serde::Deserialize;
use spanned_json_parser::parse;
#[derive(Deserialize)]
struct Test {
pub hello: String,
}
fn main() {
let json = r#"{"hello": "world"}"#;
let parsed = parse(json).unwrap();
let test: Test = serde_json::from_value(serde_json::to_value(parsed).unwrap()).unwrap();
println!("Test hello: {}", test.hello);
}
性能
以下是基准测试的输出。所有测试都在Macbook Pro M1上完成,所以请记住,这些数字只是为了给您一个性能的参考,可能并不具有代表性
Parser ./benches/data/twitter.json
time: [10.220 ms 10.279 ms 10.334 ms]
thrpt: [58.280 MiB/s 58.589 MiB/s 58.932 MiB/s]
Parser ./benches/data/citm_catalog.json
time: [18.204 ms 18.281 ms 18.353 ms]
thrpt: [89.752 MiB/s 90.102 MiB/s 90.486 MiB/s]
Parser ./benches/data/canada.json
time: [42.026 ms 42.188 ms 42.341 ms]
thrpt: [50.702 MiB/s 50.886 MiB/s 51.082 MiB/s]
依赖关系
~1–1.5MB
~29K SLoC