__init__.py revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)r"""
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)A simple, fast, extensible JSON encoder and decoder
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)JSON (JavaScript Object Notation) <http://json.org> is a subset of
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)interchange format.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)simplejson exposes an API familiar to uses of the standard library
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)marshal and pickle modules.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Encoding basic Python object hierarchies::
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> import simplejson
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> simplejson.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    '["foo", {"bar": ["baz", null, 1.0, 2]}]'
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> print simplejson.dumps("\"foo\bar")
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\"foo\bar"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> print simplejson.dumps(u'\u1234')
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\u1234"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> print simplejson.dumps('\\')
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\\"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> print simplejson.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"a": 0, "b": 0, "c": 0}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> from StringIO import StringIO
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> io = StringIO()
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> simplejson.dump(['streaming API'], io)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> io.getvalue()
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    '["streaming API"]'
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Compact encoding::
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> import simplejson
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> simplejson.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',',':'))
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    '[1,2,3,{"4":5,"6":7}]'
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Pretty printing::
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> import simplejson
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> print simplejson.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "4": 5,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "6": 7
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Decoding JSON::
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> import simplejson
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> simplejson.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    [u'foo', {u'bar': [u'baz', None, 1.0, 2]}]
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> simplejson.loads('"\\"foo\\bar"')
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    u'"foo\x08ar'
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> from StringIO import StringIO
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> io = StringIO('["streaming API"]')
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> simplejson.load(io)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    [u'streaming API']
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Specializing JSON object decoding::
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> import simplejson
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> def as_complex(dct):
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ...     if '__complex__' in dct:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ...         return complex(dct['real'], dct['imag'])
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ...     return dct
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ...
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> simplejson.loads('{"__complex__": true, "real": 1, "imag": 2}',
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ...     object_hook=as_complex)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (1+2j)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Extending JSONEncoder::
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> import simplejson
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> class ComplexEncoder(simplejson.JSONEncoder):
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ...     def default(self, obj):
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ...         if isinstance(obj, complex):
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ...             return [obj.real, obj.imag]
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ...         return simplejson.JSONEncoder.default(self, obj)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ...
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> dumps(2 + 1j, cls=ComplexEncoder)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    '[2.0, 1.0]'
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> ComplexEncoder().encode(2 + 1j)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    '[2.0, 1.0]'
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    >>> list(ComplexEncoder().iterencode(2 + 1j))
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ['[', '2.0', ', ', '1.0', ']']
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Note that the JSON produced by this module's default settings
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)is a subset of YAML, so it may be used as a serializer for that as well.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__version__ = '1.7.3'
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__all__ = [
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'dump', 'dumps', 'load', 'loads',
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'JSONDecoder', 'JSONEncoder',
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)]
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from decoder import JSONDecoder
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from encoder import JSONEncoder
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_default_encoder = JSONEncoder(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    skipkeys=False,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ensure_ascii=True,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    check_circular=True,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    allow_nan=True,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    indent=None,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    separators=None,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    encoding='utf-8'
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles))
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        allow_nan=True, cls=None, indent=None, separators=None,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        encoding='utf-8', **kw):
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ``.write()``-supporting file-like object).
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    If ``skipkeys`` is ``True`` then ``dict`` keys that are not basic types
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    will be skipped instead of raising a ``TypeError``.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    If ``ensure_ascii`` is ``False``, then the some chunks written to ``fp``
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    may be ``unicode`` instances, subject to normal Python ``str`` to
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ``unicode`` coercion rules. Unless ``fp.write()`` explicitly
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    understands ``unicode`` (as in ``codecs.getwriter()``) this is likely
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    to cause an error.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    If ``check_circular`` is ``False``, then the circular reference check
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for container types will be skipped and a circular reference will
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result in an ``OverflowError`` (or worse).
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    If ``allow_nan`` is ``False``, then it will be a ``ValueError`` to
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    in strict compliance of the JSON specification, instead of using the
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    If ``indent`` is a non-negative integer, then JSON array elements and object
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    members will be pretty-printed with that indent level. An indent level
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    of 0 will only insert newlines. ``None`` is the most compact representation.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    If ``separators`` is an ``(item_separator, dict_separator)`` tuple
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    then it will be used instead of the default ``(', ', ': ')`` separators.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ``(',', ':')`` is the most compact JSON representation.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ``encoding`` is the character encoding for str instances, default is UTF-8.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ``.default()`` method to serialize additional types), specify it with
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    the ``cls`` kwarg.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # cached encoder
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (skipkeys is False and ensure_ascii is True and
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        check_circular is True and allow_nan is True and
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cls is None and indent is None and separators is None and
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        encoding == 'utf-8' and not kw):
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        iterable = _default_encoder.iterencode(obj)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if cls is None:
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cls = JSONEncoder
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            check_circular=check_circular, allow_nan=allow_nan, indent=indent,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            separators=separators, encoding=encoding, **kw).iterencode(obj)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # could accelerate with writelines in some versions of Python, at
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # a debuggability cost
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for chunk in iterable:
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fp.write(chunk)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        allow_nan=True, cls=None, indent=None, separators=None,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        encoding='utf-8', **kw):
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Serialize ``obj`` to a JSON formatted ``str``.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    If ``skipkeys`` is ``True`` then ``dict`` keys that are not basic types
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    will be skipped instead of raising a ``TypeError``.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    If ``ensure_ascii`` is ``False``, then the return value will be a
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ``unicode`` instance subject to normal Python ``str`` to ``unicode``
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    coercion rules instead of being escaped to an ASCII ``str``.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    If ``check_circular`` is ``False``, then the circular reference check
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for container types will be skipped and a circular reference will
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result in an ``OverflowError`` (or worse).
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    If ``allow_nan`` is ``False``, then it will be a ``ValueError`` to
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    strict compliance of the JSON specification, instead of using the
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    If ``indent`` is a non-negative integer, then JSON array elements and
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    object members will be pretty-printed with that indent level. An indent
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    level of 0 will only insert newlines. ``None`` is the most compact
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    representation.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    If ``separators`` is an ``(item_separator, dict_separator)`` tuple
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    then it will be used instead of the default ``(', ', ': ')`` separators.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ``(',', ':')`` is the most compact JSON representation.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ``encoding`` is the character encoding for str instances, default is UTF-8.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ``.default()`` method to serialize additional types), specify it with
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    the ``cls`` kwarg.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # cached encoder
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (skipkeys is False and ensure_ascii is True and
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        check_circular is True and allow_nan is True and
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cls is None and indent is None and separators is None and
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        encoding == 'utf-8' and not kw):
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return _default_encoder.encode(obj)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if cls is None:
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cls = JSONEncoder
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return cls(
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        skipkeys=skipkeys, ensure_ascii=ensure_ascii,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        check_circular=check_circular, allow_nan=allow_nan, indent=indent,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        separators=separators, encoding=encoding,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        **kw).encode(obj)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_default_decoder = JSONDecoder(encoding=None, object_hook=None)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def load(fp, encoding=None, cls=None, object_hook=None, **kw):
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    a JSON document) to a Python object.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    If the contents of ``fp`` is encoded with an ASCII based encoding other
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    than utf-8 (e.g. latin-1), then an appropriate ``encoding`` name must
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    be specified. Encodings that are not ASCII based (such as UCS-2) are
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    not allowed, and should be wrapped with
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ``codecs.getreader(fp)(encoding)``, or simply decoded to a ``unicode``
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    object and passed to ``loads()``
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ``object_hook`` is an optional function that will be called with the
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result of any object literal decode (a ``dict``). The return value of
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ``object_hook`` will be used instead of the ``dict``. This feature
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    can be used to implement custom decoders (e.g. JSON-RPC class hinting).
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kwarg.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return loads(fp.read(),
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        encoding=encoding, cls=cls, object_hook=object_hook, **kw)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def loads(s, encoding=None, cls=None, object_hook=None, **kw):
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    document) to a Python object.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    If ``s`` is a ``str`` instance and is encoded with an ASCII based encoding
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    other than utf-8 (e.g. latin-1) then an appropriate ``encoding`` name
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    must be specified. Encodings that are not ASCII based (such as UCS-2)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    are not allowed and should be decoded to ``unicode`` first.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ``object_hook`` is an optional function that will be called with the
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result of any object literal decode (a ``dict``). The return value of
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ``object_hook`` will be used instead of the ``dict``. This feature
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    can be used to implement custom decoders (e.g. JSON-RPC class hinting).
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kwarg.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if cls is None and encoding is None and object_hook is None and not kw:
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return _default_decoder.decode(s)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if cls is None:
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cls = JSONDecoder
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if object_hook is not None:
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kw['object_hook'] = object_hook
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return cls(encoding=encoding, **kw).decode(s)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def read(s):
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    json-py API compatibility hook. Use loads(s) instead.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    import warnings
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    warnings.warn("simplejson.loads(s) should be used instead of read(s)",
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DeprecationWarning)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return loads(s)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def write(obj):
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    json-py API compatibility hook. Use dumps(s) instead.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    import warnings
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    warnings.warn("simplejson.dumps(s) should be used instead of write(s)",
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DeprecationWarning)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return dumps(obj)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
288