# Spanned Json Parser This crate is a json parser that will return span information for values, which mean lines and column number. It is also compatible with [serde](https://serde.rs/) so you can serialize it to any other struct that implements [Deserialize](https://docs.rs/serde/latest/serde/de/trait.Deserialize.html) ## Why use it ? One of the main use case is to do validation after parsing. By having the line and col number, you can tell really precisely to user where a value is invalid ## How to use it ? The crate expose a `Value` that is similar to [serde](https://docs.rs/serde_json/latest/serde_json/value/enum.Value.html), and wraps everything into this struct: ```rust pub struct Position { pub col: usize, pub line: usize, } pub struct SpannedValue { pub value: Value, pub start: Position, pub end: Position, } ``` ### Parsing ```rust 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); } ``` ### Serializing in a struct ```rust 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); } ``` ## Performance Here are the outputs of the benchmark. Everything was tested on a Macbook Pro M1, so keep in mind that this numbers are here to give you an idea of the performance, but might not be representative of the reality: ``` 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] ```