canonical_json 0.5.0

A Canonical JSON serializer
Documentation
# Canonical JSON library

Canonical JSON is a variant of JSON in which each value has a single,
unambiguous serialized form. This provides meaningful and repeatable hashes
of encoded data.

Canonical JSON can be parsed by regular JSON parsers. The most notable differences compared to usual JSON format ([RFC 7159](https://tools.ietf.org/html/rfc7159) or ``serde_json::to_string()``) are:

- Object keys must appear in lexiographical order and must not be repeated
- No inter-token whitespace
- Unicode characters and escaped characters are escaped

This library follows [gibson's Canonical JSON spec](https://github.com/gibson042/canonicaljson-spec).

## Usage

Add this to your ``Cargo.toml``:

```toml
[dependencies]
canonical_json = "0.5.0"
```

## Examples

```rust,no_run
   use serde_json::json;
   use canonical_json::ser::to_string;

   fn main() {
     to_string(&json!(null)); // returns "null"

     to_string(&json!("we ❤ Rust")); // returns "we \u2764 Rust""

     to_string(&json!(10.0_f64.powf(21.0))); // returns "1e+21"

     to_string(&json!({
         "a": "a",
         "id": "1",
         "b": "b"
     })); // returns "{"a":"a","b":"b","id":"1"}"; (orders object keys)

     to_string(&json!(vec!["one", "two", "three"])); // returns "["one","two","three"]"
   }
```

## Test suite

Run the projet test suite:

```
$ cargo test
```

Run @gibson042's Canonical JSON test suite:

```
$ git clone git@github.com:gibson042/canonicaljson-spec.git
$ cd canonicaljson-spec/
$ ./test.sh ../canonicaljson-rs/demo/target/debug/demo
```

Some known errors:

- `lone leading surrogate in hex escape`
- `number out of range`
- `Non-token input after 896 characters: "\u6} surrogate pair\u2014U+1D306`


## See also

* [python-canonicaljson-rs]https://github.com/mozilla-services/python-canonicaljson-rs/: Python bindings for this crate
* [CanonicalJSON.jsm]https://searchfox.org/mozilla-central/rev/358cef5d1a87172f23b15e1a705d6f278db4cdad/toolkit/modules/CanonicalJSON.jsm in Gecko
* [Original python implementation]https://github.com/Kinto/kinto-signer/blob/6.1.0/kinto_signer/canonicaljson.py in Remote Settings
* https://github.com/matrix-org/python-canonicaljson/  (encodes unicode with ``\xDD`` instead of ``\uDDDD``)

## License

Licensed under MIT