A subset of JSON.
JSON contains redundant syntax such as allowing both 10e2
and 10E2
. This helps when writing it by hand but isn't good for machine-to-machine communication. Piping JSON through multiple programs creates lots of trivial changes, which makes it hard to do things like take meaningful diffs.
Son is a subset of JSON without redundant options. It's intended for machine-to-machine communication by programs that want to follow Postel's Law -- they can accept normal JSON for flexibility and output Son for consistency.
- No exponential notation
- No trailing zeros in fractions
- No negative zero
- No positive sign
- No unnecessary escape sequences
JSON doesn't allow Unicode characters below codepoint x20 or unescaped "
and \
in strings. To allow these to still be encoded in JSON we've had to keep a few escape sequences. We use two-character escape sequences (e.g. \n
) when available, and six-character ones (e.g. \u0001
) when not.
- No insignificant whitespace
Unreleased. Like JSON, the intention is that once Son is released it will never change.
The formal part of its specification is ./son.ebnf. It uses the EBNF notation described here.
Additionally:
-
The only valid byte encoding of Son is UTF-8. Byte order marks are forbidden.
-
Object keys must be unique.
-
Object members must be sorted by ascending lexicographic order of their keys.
- Haskell reference implementation: ./implementation.
-
@chmike and @etherealvisage: key ordering should specify "ascending".
-
@John-Nagle: UTF-8 should be the only allowed encoding.
See here.