Jsonxf
A JSON transformer, written in Rust.
Provides fast pretty-printing and minimizing of JSON-encoded strings and streams, at the command line or within Rust programs.
Crate docs: https://docs.rs/jsonxf/
Installation
cargo install jsonxf
Command-line Examples
Pretty-print a string to the terminal, using two spaces to indent:
jsonxf -s '{"a": {"b": 2, "c": false}}'
Pretty-print and read a JSON file, using a tab character to indent:
jsonxf -t $'\t' <foo.json | less
Minimize a file and gzip it:
jsonxf -m <foo.json | gzip -c >foo-min.json.gz
Run jsonxf -h
to see all configuration options.
Rust Example
In your Cargo.toml
:
[dependencies]
jsonxf = "1.0"
In your code:
extern crate jsonxf;
let ugly_json = "{\"hello\":\"world\"}";
let pretty_json = pretty_print.unwrap;
assert_eq!;
Performance
Here are some benchmarks comparing Jsonxf 0.9's performance to several of its counterparts:
- jq, the extremely flexible JSON processor.
- jsonpp, a JSON pretty-printer written in Go.
- serdexf, a trivial example using the serde_json and serde-transcode libraries. This implementation is not complete and is included for library comparison only.
cat
is thrown in as well, for scale.
Test platform: MBP (early 2013), macOS 10.13.2, 3GHz i7, 8GB RAM.
See benchmark.rb for testing procedure.
Pretty-print test, 600MB minimized input (1M objects):
command | time (s) | relative time | notes |
---|---|---|---|
cat |
2.26 | 0.3x | cat is a bad pretty-printer |
jsonxf |
7.76 | 1x | |
serdexf |
9.33 | 1.2x | no newlines between objects 🙁 |
jsonpp |
25.0 | 3.2x | |
jq -M . |
67.0 | 8.6x |
Minimize test, 850MB pretty-printed input (1M objects):
command | time (s) | relative time | notes |
---|---|---|---|
cat |
1.45 | 0.2x | cat is a bad minimizer |
jsonxf -m |
6.78 | 1x | |
serdexf -m |
7.30 | 1.1x | |
jsonpp |
- | - | minimizing is not supported 😭 |
jq -cM . |
78.0 | 12x |
Authorship and License
Copyright 2017-2020, Pete Gamache.
Jsonxf is released under the MIT License.