Add the 'json' package. Code taken from simplejson 1.9 and contributed by Bob
Ippolito.
Closes issue #2750.
diff --git a/Doc/library/json.rst b/Doc/library/json.rst
new file mode 100644
index 0000000..d438a7a
--- /dev/null
+++ b/Doc/library/json.rst
@@ -0,0 +1,431 @@
+:mod:`json` JSON encoder and decoder
+====================================
+
+.. module:: json
+ :synopsis: encode and decode the JSON format
+.. moduleauthor:: Bob Ippolito <bob@redivi.com>
+.. sectionauthor:: Bob Ippolito <bob@redivi.com>
+.. versionadded:: 2.6
+
+JSON (JavaScript Object Notation) <http://json.org> is a subset of JavaScript
+syntax (ECMA-262 3rd edition) used as a lightweight data interchange format.
+
+:mod:`json` exposes an API familiar to uses of the standard library marshal and
+pickle modules.
+
+Encoding basic Python object hierarchies::
+
+ >>> import json
+ >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
+ '["foo", {"bar": ["baz", null, 1.0, 2]}]'
+ >>> print json.dumps("\"foo\bar")
+ "\"foo\bar"
+ >>> print json.dumps(u'\u1234')
+ "\u1234"
+ >>> print json.dumps('\\')
+ "\\"
+ >>> print json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
+ {"a": 0, "b": 0, "c": 0}
+ >>> from StringIO import StringIO
+ >>> io = StringIO()
+ >>> json.dump(['streaming API'], io)
+ >>> io.getvalue()
+ '["streaming API"]'
+
+Compact encoding::
+
+ >>> import json
+ >>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',',':'))
+ '[1,2,3,{"4":5,"6":7}]'
+
+Pretty printing::
+
+ >>> import json
+ >>> print json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
+ {
+ "4": 5,
+ "6": 7
+ }
+
+Decoding JSON::
+
+ >>> import json
+ >>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
+ [u'foo', {u'bar': [u'baz', None, 1.0, 2]}]
+ >>> json.loads('"\\"foo\\bar"')
+ u'"foo\x08ar'
+ >>> from StringIO import StringIO
+ >>> io = StringIO('["streaming API"]')
+ >>> json.load(io)
+ [u'streaming API']
+
+Specializing JSON object decoding::
+
+ >>> import json
+ >>> def as_complex(dct):
+ ... if '__complex__' in dct:
+ ... return complex(dct['real'], dct['imag'])
+ ... return dct
+ ...
+ >>> json.loads('{"__complex__": true, "real": 1, "imag": 2}',
+ ... object_hook=as_complex)
+ (1+2j)
+ >>> import decimal
+ >>> json.loads('1.1', parse_float=decimal.Decimal)
+ Decimal('1.1')
+
+Extending JSONEncoder::
+
+ >>> import json
+ >>> class ComplexEncoder(json.JSONEncoder):
+ ... def default(self, obj):
+ ... if isinstance(obj, complex):
+ ... return [obj.real, obj.imag]
+ ... return json.JSONEncoder.default(self, obj)
+ ...
+ >>> dumps(2 + 1j, cls=ComplexEncoder)
+ '[2.0, 1.0]'
+ >>> ComplexEncoder().encode(2 + 1j)
+ '[2.0, 1.0]'
+ >>> list(ComplexEncoder().iterencode(2 + 1j))
+ ['[', '2.0', ', ', '1.0', ']']
+
+
+.. highlight:: none
+
+Using json.tool from the shell to validate and pretty-print::
+
+ $ echo '{"json":"obj"}' | python -mjson.tool
+ {
+ "json": "obj"
+ }
+ $ echo '{ 1.2:3.4}' | python -mjson.tool
+ Expecting property name: line 1 column 2 (char 2)
+
+.. highlight:: python
+
+.. note::
+
+ Note that the JSON produced by this module's default settings is a subset of
+ YAML, so it may be used as a serializer for that as well.
+
+
+Basic Usage
+-----------
+
+.. function:: dump(obj, fp[, skipkeys[, ensure_ascii[, check_circular[, allow_nan[, cls[, indent[, separators[, encoding[, default[, **kw]]]]]]]]]])
+
+ Serialize *obj* as a JSON formatted stream to *fp* (a
+ ``.write()``-supporting file-like object).
+
+ If *skipkeys* is ``True`` (It is ``False`` by default.), then ``dict`` keys
+ that are not basic types (``str``, ``unicode``, ``int``, ``long``,
+ ``float``, ``bool``, ``None``) will be skipped instead of raising a
+ :exc:`TypeError`.
+
+ If *ensure_ascii* is ``False`` (It is ``True`` by default.), then the some
+ chunks written to *fp* may be ``unicode`` instances, subject to normal
+ Python ``str`` to ``unicode`` coercion rules. Unless ``fp.write()``
+ explicitly understands ``unicode`` (as in ``codecs.getwriter()``) this is
+ likely to cause an error.
+
+ If *check_circular* is ``False``, then the circular reference check for
+ container types will be skipped and a circular reference will result in an
+ :exc:`OverflowError` (or worse).
+
+ If *allow_nan* is ``False``, then it will be a :exc:`ValueError` to
+ serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in
+ strict compliance of the JSON specification, instead of using the JavaScript
+ equivalents (``NaN``, ``Infinity``, ``-Infinity``).
+
+ If *indent* is a non-negative integer, then JSON array elements and object
+ members will be pretty-printed with that indent level. An indent level of 0
+ will only insert newlines. ``None`` is the most compact representation.
+
+ If *separators* is an ``(item_separator, dict_separator)`` tuple then it
+ will be used instead of the default ``(', ', ': ')`` separators. ``(',',
+ ':')`` is the most compact JSON representation.
+
+ *encoding* is the character encoding for str instances, default is UTF-8.
+
+ *default(obj)* is a function that should return a serializable version of
+ obj or raise :exc:`TypeError`. The default simply raises :exc:`TypeError`.
+
+ To use a custom :class:`JSONEncoder`` subclass (e.g. one that overrides the
+ ``.default()`` method to serialize additional types), specify it with the
+ *cls* kwarg.
+
+
+.. function:: dump(obj[, skipkeys[, ensure_ascii[, check_circular[, allow_nan[, cls[, indent[, separators[, encoding[, default[, **kw]]]]]]]]]])
+
+ Serialize *obj* to a JSON formatted ``str``.
+
+ If *skipkeys* is ``True`` (It is ``False`` by default.), then ``dict`` keys
+ that are not basic types (``str``, ``unicode``, ``int``, ``long``,
+ ``float``, ``bool``, ``None``) will be skipped instead of raising a
+ :exc:`TypeError`.
+
+ If *ensure_ascii* is ``False``, then the return value will be a ``unicode``
+ instance subject to normal Python ``str`` to ``unicode`` coercion rules
+ instead of being escaped to an ASCII ``str``.
+
+ If *check_circular* is ``False``, then the circular reference check for
+ container types will be skipped and a circular reference will result in an
+ :exc:`OverflowError` (or worse).
+
+ If *allow_nan* is ``False``, then it will be a :exc:`ValueError` to
+ serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in
+ strict compliance of the JSON specification, instead of using the JavaScript
+ equivalents (``NaN``, ``Infinity``, ``-Infinity``).
+
+ If *indent* is a non-negative integer, then JSON array elements and object
+ members will be pretty-printed with that indent level. An indent level of 0
+ will only insert newlines. ``None`` is the most compact representation.
+
+ If *separators* is an ``(item_separator, dict_separator)`` tuple then it
+ will be used instead of the default ``(', ', ': ')`` separators. ``(',',
+ ':')`` is the most compact JSON representation.
+
+ *encoding* is the character encoding for str instances, default is UTF-8.
+
+ *default(obj)* is a function that should return a serializable version of
+ obj or raise :exc:`TypeError`. The default simply raises :exc:`TypeError`.
+
+ To use a custom :class:`JSONEncoder`` subclass (e.g. one that overrides the
+ ``.default()`` method to serialize additional types), specify it with the
+ *cls* kwarg.
+
+
+.. function loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, **kw]]]]]]])
+
+ Deserialize *s* (a ``str`` or ``unicode`` instance containing a JSON
+ document) to a Python object.
+
+ If *s* is a ``str`` instance and is encoded with an ASCII based encoding
+ other than utf-8 (e.g. latin-1) then an appropriate ``encoding`` name must be
+ specified. Encodings that are not ASCII based (such as UCS-2) are not allowed
+ and should be decoded to ``unicode`` first.
+
+ *object_hook* is an optional function that will be called with the result of
+ any object literal decode (a ``dict``). The return value of ``object_hook``
+ will be used instead of the ``dict``. This feature can be used to implement
+ custom decoders (e.g. JSON-RPC class hinting).
+
+ *parse_float*, if specified, will be called with the string of every JSON
+ float to be decoded. By default, this is equivalent to
+ ``float(num_str)``. This can be used to use another datatype or parser for
+ JSON floats (e.g. decimal.Decimal).
+
+ *parse_int*, if specified, will be called with the string of every JSON int
+ to be decoded. By default this is equivalent to int(num_str). This can be
+ used to use another datatype or parser for JSON integers (e.g. float).
+
+ *parse_constant*, if specified, will be called with one of the following
+ strings: -Infinity, Infinity, NaN, null, true, false. This can be used to
+ raise an exception if invalid JSON numbers are encountered.
+
+ To use a custom :class:`JSONDecoder` subclass, specify it with the ``cls``
+ kwarg. Additional keyword arguments will be passed to the constructor of the
+ class.
+
+
+.. function load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, **kw]]]]]]])
+
+ Deserialize *fp* (a ``.read()``-supporting file-like object containing a JSON
+ document) to a Python object.
+
+ If the contents of *fp* is encoded with an ASCII based encoding other than
+ utf-8 (e.g. latin-1), then an appropriate ``encoding`` name must be
+ specified. Encodings that are not ASCII based (such as UCS-2) are not
+ allowed, and should be wrapped with :func:`codecs.getreader(fp)(encoding)`,
+ or simply decoded to a ``unicode`` object and passed to ``loads()``
+
+ *object_hook* is an optional function that will be called with the result of
+ any object literal decode (a ``dict``). The return value of *object_hook*
+ will be used instead of the ``dict``. This feature can be used to implement
+ custom decoders (e.g. JSON-RPC class hinting).
+
+ To use a custom :class:`JSONDecoder` subclass, specify it with the ``cls``
+ kwarg. Additional keyword arguments will be passed to the constructor of the
+ class.
+
+
+Encoders and decoders
+---------------------
+
+.. class:: JSONDecoder([encoding[, object_hook[, parse_float[, parse_int[, parse_constant[, strict]]]]]])
+
+ Simple JSON decoder
+
+ Performs the following translations in decoding by default:
+
+ +---------------+-------------------+
+ | JSON | Python |
+ +===============+===================+
+ | object | dict |
+ +---------------+-------------------+
+ | array | list |
+ +---------------+-------------------+
+ | string | unicode |
+ +---------------+-------------------+
+ | number (int) | int, long |
+ +---------------+-------------------+
+ | number (real) | float |
+ +---------------+-------------------+
+ | true | True |
+ +---------------+-------------------+
+ | false | False |
+ +---------------+-------------------+
+ | null | None |
+ +---------------+-------------------+
+
+ It also understands ``NaN``, ``Infinity``, and ``-Infinity`` as their
+ corresponding ``float`` values, which is outside the JSON spec.
+
+ *encoding* determines the encoding used to interpret any ``str`` objects
+ decoded by this instance (utf-8 by default). It has no effect when decoding
+ ``unicode`` objects.
+
+ Note that currently only encodings that are a superset of ASCII work,
+ strings of other encodings should be passed in as ``unicode``.
+
+ *object_hook*, if specified, will be called with the result of every JSON
+ object decoded and its return value will be used in place of the given
+ ``dict``. This can be used to provide custom deserializations (e.g. to
+ support JSON-RPC class hinting).
+
+ *parse_float*, if specified, will be called with the string of every JSON
+ float to be decoded. By default this is equivalent to float(num_str). This
+ can be used to use another datatype or parser for JSON floats
+ (e.g. decimal.Decimal).
+
+ *parse_int*, if specified, will be called with the string of every JSON int
+ to be decoded. By default this is equivalent to int(num_str). This can be
+ used to use another datatype or parser for JSON integers (e.g. float).
+
+ *parse_constant*, if specified, will be called with one of the following
+ strings: -Infinity, Infinity, NaN, null, true, false. This can be used to
+ raise an exception if invalid JSON numbers are encountered.
+
+
+ .. method:: decode(s)
+
+ Return the Python representation of *s* (a ``str`` or ``unicode`` instance
+ containing a JSON document)
+
+ .. method:: raw_decode(s)
+
+ Decode a JSON document from *s* (a ``str`` or ``unicode`` beginning with a
+ JSON document) and return a 2-tuple of the Python representation and the
+ index in *s* where the document ended.
+
+ This can be used to decode a JSON document from a string that may have
+ extraneous data at the end.
+
+
+.. class:: JSONEncoder([skipkeys[, ensure_ascii[, check_circular[, allow_nan[, sort_keys[, indent[, separators[, encoding[, default]]]]]]]]])
+
+ Extensible JSON <http://json.org> encoder for Python data structures.
+
+ Supports the following objects and types by default:
+
+ +-------------------+---------------+
+ | Python | JSON |
+ +===================+===============+
+ | dict | object |
+ +-------------------+---------------+
+ | list, tuple | array |
+ +-------------------+---------------+
+ | str, unicode | string |
+ +-------------------+---------------+
+ | int, long, float | number |
+ +-------------------+---------------+
+ | True | true |
+ +-------------------+---------------+
+ | False | false |
+ +-------------------+---------------+
+ | None | null |
+ +-------------------+---------------+
+
+ To extend this to recognize other objects, subclass and implement a
+ ``.default()`` method with another method that returns a serializable object
+ for ``o`` if possible, otherwise it should call the superclass implementation
+ (to raise :exc:`TypeError`).
+
+ If *skipkeys* is ``False`` (the default), then it is a :exc:`TypeError` to
+ attempt encoding of keys that are not str, int, long, float or None. If
+ *skipkeys* is ``True``, such items are simply skipped.
+
+ If *ensure_ascii* is ``True``, the output is guaranteed to be ``str`` objects
+ with all incoming unicode characters escaped. If *ensure_ascii* is
+ ``False``, the output will be unicode object.
+
+ If *check_circular* is ``True`` (the default), then lists, dicts, and custom
+ encoded objects will be checked for circular references during encoding to
+ prevent an infinite recursion (which would cause an :exc:`OverflowError`).
+ Otherwise, no such check takes place.
+
+ If *allow_nan* is ``True`` (the default), then ``NaN``, ``Infinity``, and ``-Infinity``
+ will be encoded as such. This behavior is not JSON specification compliant,
+ but is consistent with most JavaScript based encoders and decoders.
+ Otherwise, it will be a :exc:`ValueError` to encode such floats.
+
+ If *sort_keys* is ``True`` (the default), then the output of dictionaries
+ will be sorted by key; this is useful for regression tests to ensure that
+ JSON serializations can be compared on a day-to-day basis.
+
+ If *indent* is a non-negative integer (It is ``None`` by default.), then JSON
+ array elements and object members will be pretty-printed with that indent
+ level. An indent level of 0 will only insert newlines. ``None`` is the most
+ compact representation.
+
+ If specified, *separators* should be a (item_separator, key_separator) tuple.
+ The default is ``(', ', ': ')``. To get the most compact JSON
+ representation, you should specify ``(',', ':')`` to eliminate whitespace.
+
+ If specified, *default* is a function that gets called for objects that can't
+ otherwise be serialized. It should return a JSON encodable version of the
+ object or raise a :exc:`TypeError`.
+
+ If *encoding* is not ``None``, then all input strings will be transformed
+ into unicode using that encoding prior to JSON-encoding. The default is
+ UTF-8.
+
+
+ .. method:: default(o)
+
+ Implement this method in a subclass such that it returns a serializable
+ object for *o*, or calls the base implementation (to raise a
+ :exc:`TypeError`).
+
+ For example, to support arbitrary iterators, you could implement default
+ like this::
+
+ def default(self, o):
+ try:
+ iterable = iter(o)
+ except TypeError:
+ pass
+ else:
+ return list(iterable)
+ return JSONEncoder.default(self, o)
+
+
+ .. method:: encode(o)
+
+ Return a JSON string representation of a Python data structure, *o*. For
+ example::
+
+ >>> JSONEncoder().encode({"foo": ["bar", "baz"]})
+ '{"foo": ["bar", "baz"]}'
+
+
+ .. method:: iterencode(o)
+
+ Encode the given object, *o*, and yield each string representation as
+ available.
+
+ For example::
+
+ for chunk in JSONEncoder().iterencode(bigobject):
+ mysocket.write(chunk)