[![test](https://github.com/jorgecarleitao/json-deserializer/actions/workflows/test.yml/badge.svg)](https://github.com/jorgecarleitao/json-deserializer/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/jorgecarleitao/json-deserializer/branch/main/graph/badge.svg?token=AgyTF60R3D)](https://codecov.io/gh/jorgecarleitao/json-deserializer) # Rust native JSON deserializer This repository contains a performant Rust implementation to parse JSON by reference. ## Why not `serde-json`? `serde-json` is both a JSON parser and data model based on serde's model (`Value`). `Value` is an owning data structure. In many use cases, JSON can be parsed into references. In particular, ownership of strings is only required when the JSON string contains non-ascii characters. There is a performance oportunity if JSON is parsed by reference instead of by value when possible. This crate fills this gap. When parsing e.g. a list of strings, this crate is ~2x faster than `serde-json` (see below). ## Safety This crate is `#![forbid(unsafe_code)]` and only panics on failed allocations. ### Benches Run ```bash python3 write_bench_files.py && cargo bench --bench parse ``` for a comparison with `serde_json`. Broadly speaking, this crate is either faster or equally fast. Some examples: ### Array of bools ``` bool json_deserializer 2^20 time: [26.022 ms 26.056 ms 26.090 ms] bool serde_json 2^20 time: [30.419 ms 30.468 ms 30.516 ms] bool simd_json 2^20 time: [31.440 ms 31.486 ms 31.531 ms] ``` ### Array of strings ``` string json_deserializer 2^18 time: [10.106 ms 10.138 ms 10.173 ms] string serde_json 2^18 time: [23.177 ms 23.209 ms 23.243 ms] string simd_json 2^18 time: [10.924 ms 10.941 ms 10.959 ms] # with `RUSTFLAGS='-C target-cpu=native'` (skilake in this case) string simd_json 2^18 time: [8.0735 ms 8.0887 ms 8.1046 ms] ``` ### Array of an object with a string ``` object_string json_deserializer 2^14 time: [2.7631 ms 2.7681 ms 2.7736 ms] object_string serde_json 2^14 time: [4.3729 ms 4.3823 ms 4.3922 ms] object_string simd_json 2^14 time: [2.6313 ms 2.6357 ms 2.6401 ms] ``` ### Array of an object with a bool ``` object_bool json_deserializer 2^10 time: [144.14 us 144.35 us 144.62 us] object_bool serde_json 2^10 time: [197.12 us 197.62 us 198.31 us] object_bool simd_json 2^10 time: [160.87 us 161.33 us 161.77 us] ```