#json-parser #line-column #line-numbers #json #parser #column #line

spanned_json_parser

一个Json解析器,为每个值提供行号和列号

3个不稳定版本

0.2.0 2023年11月10日
0.1.1 2023年11月7日
0.1.0 2023年11月6日

#2751 in 解析实现

28 每月下载次数

MIT 许可证

36KB
914

Spanned Json Parser

这个crate是一个json解析器,它将为值返回跨度信息,这意味着行号和列号。它还与serde兼容,因此您可以将其序列化到任何实现Deserialize的其他结构中

为什么使用它?

主要用例之一是在解析后进行验证。通过拥有行和列号,您可以非常精确地告诉用户值在哪里无效

如何使用它?

这个crate公开了一个类似于serdeValue,并将所有内容都包装在这个结构中

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