This parameter determines the default Racket value that corresponds to
a JSON “null”. By default, it is the 'null symbol.
In some cases a different value may better fit your needs, therefore
all functions in this library accept a #:null keyword
argument for the value that is used to represent a JSON “null”,
and this argument defaults to (json-null).

By default, only ASCII control characters are encoded as
“\uHHHH”. If encode is given as 'all, then
in addition to ASCII control characters, non-ASCII characters are
encoded as well. This can be useful if you need to transport the text
via channels that might not support UTF-8. Note that characters in
the range of U+10000 and above are encoded as two \uHHHH
escapes, see Section 2.5 of the JSON RFC.

4A Word About Design

4.1The JS-Expression Data Type

JSON syntactically distinguishes “null”, array literals, and
object literals, and therefore there is a question of what Racket value
should represent a JSON “null”. This library uses the Racket
'null symbol by default. Note that this is unambiguous, since
Racket symbols are used only as object keys, which are required to be
strings in JSON.

Several other options have been used by various libaries. For example,
Dave Herman’s PLaneT library (which has been the basis for this library)
uses the #\nul character, other libraries for Racket and other
Lisps use (void), NIL (some use it also for JSON
“false”), and more. The approach taken by this library is to use
a keyword argument for all functions, with a parameter that determines
its default, making it easy to use any value that fits your needs.

The JSON RFC only states that object literal expressions “SHOULD” contain
unique keys, but does not proscribe them entirely. Looking at existing
practice, it appears that popular JSON libraries parse object literals
with duplicate keys by simply picking one of the key-value pairs and
discarding the others with the same key. This behavior is naturally
paralleled by Racket hash tables, making them a natural analog.

Finally, the JSON RFC is almost completely silent about the order of
key-value pairs. While the RFC only specifies the syntax of JSON, which
of course always must represent object literals as an ordered
collection, the introduction states:

An object is an unordered collection of zero or more name/value pairs,
where a name is a string and a value is a string, number, boolean,
null, object, or array.

In practice, JSON libraries discard the order of object literals in
parsed JSON text and make no guarantees about the order of generated
object literals, usually using a hash table of some flavor as a natural
choice. We therefore use do so as well.

4.2Naming Conventions

Some names in this library use “jsexpr” and some use “json”. The
rationale that the first is used for our representation, and the second
is used as information that is received from or sent to the outside
world.