bufjson. Fast streaming JSON parser / Read JSON without allocation or copy.
Get started
Add bufjson to your Cargo.toml or run $ cargo add bufjson.
Find a simple getting started example below, with further examples available in the API reference docs.
Features
- Streaming pull parser (lower level, does not "map" data into a data structure).
- Best in class speed, second only to
simd-json(but with more flexibility and features) - Minimizes allocations and data copying.
- Idiomatic, friendly API with intuitive layered architecture.
- Clear structured error messages with pinpoint locations.
- Fast streaming JSON Pointer evaluation.
no_stdsupport.
Use cases
- Scan or parse JSON with minimal CPU and memory pressure.
- Handle arbitrary sized JSON text, essentially unlimited length streams supported with consistent high performance.
- Incrementally parse large documents in pieces as they become available (no big bang).
- Zero-copy network programming with frameworks such as
hyper, reading directly from theBytes. - Async JSON parsing.
- Handle concatenated JSON formats like JSONL, NDJSON, JSON Text Sequences (RFC 7464) and delimiter-free concatenated JSON.
Comparison to other crates
Click the links below to see how bufjson compares to other JSON parsing crates. Includes feature
comparisons and benchmark numbers.
Performance & benchmarks
The table below shows JSON text throughput benchmark results.1
| Component | .content() fetched |
Throughput |
|---|---|---|
FixedAnalyzer |
Never | 1.1 GiB/s |
FixedAnalyzer |
Always | 1.1 GiB/s |
Parser + FixedAnalyzer |
Never | 1 GiB/s |
Parser + FixedAnalyzer |
Always | 950 MiB/s |
PipeAnalyzer |
Never | 950 MiB/s |
PipeAnalyzer |
Always | 730 MiB/s |
ReadAnalyzer2 |
Never | 900 MiB/s |
ReadAnalyzer2 |
Always | 700 MiB/s |
Example
This example uses all layers of the bufjson stack (lexical analyzer, syntax parser, streaming JSON
Pointer evaluator) to redact designated paths from the JSON text, leaving everything else intact.
use ;
In the above example, the entire parsing and JSON Pointer evaluation process of the input is done without any allocation whatsoever.
A more sophisticated version of the same code that streams its output with minimal allocation and
copying can be written using zero-copy Bytes structures and the PipeAnalyzer lexical analyzer.