1d0825bca7fe65beaee391d30da42e937db621564Steve Blockr"""
2d0825bca7fe65beaee391d30da42e937db621564Steve BlockA simple, fast, extensible JSON encoder and decoder
3d0825bca7fe65beaee391d30da42e937db621564Steve Block
4d0825bca7fe65beaee391d30da42e937db621564Steve BlockJSON (JavaScript Object Notation) <http://json.org> is a subset of
5d0825bca7fe65beaee391d30da42e937db621564Steve BlockJavaScript syntax (ECMA-262 3rd edition) used as a lightweight data
6d0825bca7fe65beaee391d30da42e937db621564Steve Blockinterchange format.
7d0825bca7fe65beaee391d30da42e937db621564Steve Block
8d0825bca7fe65beaee391d30da42e937db621564Steve Blocksimplejson exposes an API familiar to uses of the standard library
9d0825bca7fe65beaee391d30da42e937db621564Steve Blockmarshal and pickle modules.
10d0825bca7fe65beaee391d30da42e937db621564Steve Block
11d0825bca7fe65beaee391d30da42e937db621564Steve BlockEncoding basic Python object hierarchies::
12d0825bca7fe65beaee391d30da42e937db621564Steve Block
13d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> import simplejson
14d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> simplejson.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
15d0825bca7fe65beaee391d30da42e937db621564Steve Block    '["foo", {"bar": ["baz", null, 1.0, 2]}]'
16d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> print simplejson.dumps("\"foo\bar")
17d0825bca7fe65beaee391d30da42e937db621564Steve Block    "\"foo\bar"
18d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> print simplejson.dumps(u'\u1234')
19d0825bca7fe65beaee391d30da42e937db621564Steve Block    "\u1234"
20d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> print simplejson.dumps('\\')
21d0825bca7fe65beaee391d30da42e937db621564Steve Block    "\\"
22d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> print simplejson.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
23d0825bca7fe65beaee391d30da42e937db621564Steve Block    {"a": 0, "b": 0, "c": 0}
24d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> from StringIO import StringIO
25d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> io = StringIO()
26d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> simplejson.dump(['streaming API'], io)
27d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> io.getvalue()
28d0825bca7fe65beaee391d30da42e937db621564Steve Block    '["streaming API"]'
29d0825bca7fe65beaee391d30da42e937db621564Steve Block
30d0825bca7fe65beaee391d30da42e937db621564Steve BlockCompact encoding::
31d0825bca7fe65beaee391d30da42e937db621564Steve Block
32d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> import simplejson
33d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> simplejson.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',',':'))
34d0825bca7fe65beaee391d30da42e937db621564Steve Block    '[1,2,3,{"4":5,"6":7}]'
35d0825bca7fe65beaee391d30da42e937db621564Steve Block
36d0825bca7fe65beaee391d30da42e937db621564Steve BlockPretty printing::
37d0825bca7fe65beaee391d30da42e937db621564Steve Block
38d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> import simplejson
39d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> print simplejson.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
40d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
41d0825bca7fe65beaee391d30da42e937db621564Steve Block        "4": 5,
42d0825bca7fe65beaee391d30da42e937db621564Steve Block        "6": 7
43d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
44d0825bca7fe65beaee391d30da42e937db621564Steve Block
45d0825bca7fe65beaee391d30da42e937db621564Steve BlockDecoding JSON::
46d0825bca7fe65beaee391d30da42e937db621564Steve Block
47d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> import simplejson
48d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> simplejson.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
49d0825bca7fe65beaee391d30da42e937db621564Steve Block    [u'foo', {u'bar': [u'baz', None, 1.0, 2]}]
50d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> simplejson.loads('"\\"foo\\bar"')
51d0825bca7fe65beaee391d30da42e937db621564Steve Block    u'"foo\x08ar'
52d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> from StringIO import StringIO
53d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> io = StringIO('["streaming API"]')
54d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> simplejson.load(io)
55d0825bca7fe65beaee391d30da42e937db621564Steve Block    [u'streaming API']
56d0825bca7fe65beaee391d30da42e937db621564Steve Block
57d0825bca7fe65beaee391d30da42e937db621564Steve BlockSpecializing JSON object decoding::
58d0825bca7fe65beaee391d30da42e937db621564Steve Block
59d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> import simplejson
60d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> def as_complex(dct):
61d0825bca7fe65beaee391d30da42e937db621564Steve Block    ...     if '__complex__' in dct:
62d0825bca7fe65beaee391d30da42e937db621564Steve Block    ...         return complex(dct['real'], dct['imag'])
63d0825bca7fe65beaee391d30da42e937db621564Steve Block    ...     return dct
64d0825bca7fe65beaee391d30da42e937db621564Steve Block    ...
65d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> simplejson.loads('{"__complex__": true, "real": 1, "imag": 2}',
66d0825bca7fe65beaee391d30da42e937db621564Steve Block    ...     object_hook=as_complex)
67d0825bca7fe65beaee391d30da42e937db621564Steve Block    (1+2j)
68d0825bca7fe65beaee391d30da42e937db621564Steve Block
69d0825bca7fe65beaee391d30da42e937db621564Steve BlockExtending JSONEncoder::
70d0825bca7fe65beaee391d30da42e937db621564Steve Block
71d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> import simplejson
72d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> class ComplexEncoder(simplejson.JSONEncoder):
73d0825bca7fe65beaee391d30da42e937db621564Steve Block    ...     def default(self, obj):
74d0825bca7fe65beaee391d30da42e937db621564Steve Block    ...         if isinstance(obj, complex):
75d0825bca7fe65beaee391d30da42e937db621564Steve Block    ...             return [obj.real, obj.imag]
76d0825bca7fe65beaee391d30da42e937db621564Steve Block    ...         return simplejson.JSONEncoder.default(self, obj)
77d0825bca7fe65beaee391d30da42e937db621564Steve Block    ...
78d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> dumps(2 + 1j, cls=ComplexEncoder)
79d0825bca7fe65beaee391d30da42e937db621564Steve Block    '[2.0, 1.0]'
80d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> ComplexEncoder().encode(2 + 1j)
81d0825bca7fe65beaee391d30da42e937db621564Steve Block    '[2.0, 1.0]'
82d0825bca7fe65beaee391d30da42e937db621564Steve Block    >>> list(ComplexEncoder().iterencode(2 + 1j))
83d0825bca7fe65beaee391d30da42e937db621564Steve Block    ['[', '2.0', ', ', '1.0', ']']
84d0825bca7fe65beaee391d30da42e937db621564Steve Block
85d0825bca7fe65beaee391d30da42e937db621564Steve Block
86d0825bca7fe65beaee391d30da42e937db621564Steve BlockNote that the JSON produced by this module's default settings
87d0825bca7fe65beaee391d30da42e937db621564Steve Blockis a subset of YAML, so it may be used as a serializer for that as well.
88d0825bca7fe65beaee391d30da42e937db621564Steve Block"""
89d0825bca7fe65beaee391d30da42e937db621564Steve Block__version__ = '1.7.3'
90d0825bca7fe65beaee391d30da42e937db621564Steve Block__all__ = [
91d0825bca7fe65beaee391d30da42e937db621564Steve Block    'dump', 'dumps', 'load', 'loads',
92d0825bca7fe65beaee391d30da42e937db621564Steve Block    'JSONDecoder', 'JSONEncoder',
93d0825bca7fe65beaee391d30da42e937db621564Steve Block]
94d0825bca7fe65beaee391d30da42e937db621564Steve Block
95d0825bca7fe65beaee391d30da42e937db621564Steve Blockfrom decoder import JSONDecoder
96d0825bca7fe65beaee391d30da42e937db621564Steve Blockfrom encoder import JSONEncoder
97d0825bca7fe65beaee391d30da42e937db621564Steve Block
98d0825bca7fe65beaee391d30da42e937db621564Steve Block_default_encoder = JSONEncoder(
99d0825bca7fe65beaee391d30da42e937db621564Steve Block    skipkeys=False,
100d0825bca7fe65beaee391d30da42e937db621564Steve Block    ensure_ascii=True,
101d0825bca7fe65beaee391d30da42e937db621564Steve Block    check_circular=True,
102d0825bca7fe65beaee391d30da42e937db621564Steve Block    allow_nan=True,
103d0825bca7fe65beaee391d30da42e937db621564Steve Block    indent=None,
104d0825bca7fe65beaee391d30da42e937db621564Steve Block    separators=None,
105d0825bca7fe65beaee391d30da42e937db621564Steve Block    encoding='utf-8'
106d0825bca7fe65beaee391d30da42e937db621564Steve Block)
107d0825bca7fe65beaee391d30da42e937db621564Steve Block
108d0825bca7fe65beaee391d30da42e937db621564Steve Blockdef dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
109d0825bca7fe65beaee391d30da42e937db621564Steve Block        allow_nan=True, cls=None, indent=None, separators=None,
110d0825bca7fe65beaee391d30da42e937db621564Steve Block        encoding='utf-8', **kw):
111d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
112d0825bca7fe65beaee391d30da42e937db621564Steve Block    Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
113d0825bca7fe65beaee391d30da42e937db621564Steve Block    ``.write()``-supporting file-like object).
114d0825bca7fe65beaee391d30da42e937db621564Steve Block
115d0825bca7fe65beaee391d30da42e937db621564Steve Block    If ``skipkeys`` is ``True`` then ``dict`` keys that are not basic types
116d0825bca7fe65beaee391d30da42e937db621564Steve Block    (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``)
117d0825bca7fe65beaee391d30da42e937db621564Steve Block    will be skipped instead of raising a ``TypeError``.
118d0825bca7fe65beaee391d30da42e937db621564Steve Block
119d0825bca7fe65beaee391d30da42e937db621564Steve Block    If ``ensure_ascii`` is ``False``, then the some chunks written to ``fp``
120d0825bca7fe65beaee391d30da42e937db621564Steve Block    may be ``unicode`` instances, subject to normal Python ``str`` to
121d0825bca7fe65beaee391d30da42e937db621564Steve Block    ``unicode`` coercion rules. Unless ``fp.write()`` explicitly
122d0825bca7fe65beaee391d30da42e937db621564Steve Block    understands ``unicode`` (as in ``codecs.getwriter()``) this is likely
123d0825bca7fe65beaee391d30da42e937db621564Steve Block    to cause an error.
124d0825bca7fe65beaee391d30da42e937db621564Steve Block
125d0825bca7fe65beaee391d30da42e937db621564Steve Block    If ``check_circular`` is ``False``, then the circular reference check
126d0825bca7fe65beaee391d30da42e937db621564Steve Block    for container types will be skipped and a circular reference will
127d0825bca7fe65beaee391d30da42e937db621564Steve Block    result in an ``OverflowError`` (or worse).
128d0825bca7fe65beaee391d30da42e937db621564Steve Block
129d0825bca7fe65beaee391d30da42e937db621564Steve Block    If ``allow_nan`` is ``False``, then it will be a ``ValueError`` to
130d0825bca7fe65beaee391d30da42e937db621564Steve Block    serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``)
131d0825bca7fe65beaee391d30da42e937db621564Steve Block    in strict compliance of the JSON specification, instead of using the
132d0825bca7fe65beaee391d30da42e937db621564Steve Block    JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
133d0825bca7fe65beaee391d30da42e937db621564Steve Block
134d0825bca7fe65beaee391d30da42e937db621564Steve Block    If ``indent`` is a non-negative integer, then JSON array elements and object
135d0825bca7fe65beaee391d30da42e937db621564Steve Block    members will be pretty-printed with that indent level. An indent level
136d0825bca7fe65beaee391d30da42e937db621564Steve Block    of 0 will only insert newlines. ``None`` is the most compact representation.
137d0825bca7fe65beaee391d30da42e937db621564Steve Block
138d0825bca7fe65beaee391d30da42e937db621564Steve Block    If ``separators`` is an ``(item_separator, dict_separator)`` tuple
139d0825bca7fe65beaee391d30da42e937db621564Steve Block    then it will be used instead of the default ``(', ', ': ')`` separators.
140d0825bca7fe65beaee391d30da42e937db621564Steve Block    ``(',', ':')`` is the most compact JSON representation.
141d0825bca7fe65beaee391d30da42e937db621564Steve Block
142d0825bca7fe65beaee391d30da42e937db621564Steve Block    ``encoding`` is the character encoding for str instances, default is UTF-8.
143d0825bca7fe65beaee391d30da42e937db621564Steve Block
144d0825bca7fe65beaee391d30da42e937db621564Steve Block    To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
145d0825bca7fe65beaee391d30da42e937db621564Steve Block    ``.default()`` method to serialize additional types), specify it with
146d0825bca7fe65beaee391d30da42e937db621564Steve Block    the ``cls`` kwarg.
147d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
148d0825bca7fe65beaee391d30da42e937db621564Steve Block    # cached encoder
149d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (skipkeys is False and ensure_ascii is True and
150d0825bca7fe65beaee391d30da42e937db621564Steve Block        check_circular is True and allow_nan is True and
151d0825bca7fe65beaee391d30da42e937db621564Steve Block        cls is None and indent is None and separators is None and
152d0825bca7fe65beaee391d30da42e937db621564Steve Block        encoding == 'utf-8' and not kw):
153d0825bca7fe65beaee391d30da42e937db621564Steve Block        iterable = _default_encoder.iterencode(obj)
154d0825bca7fe65beaee391d30da42e937db621564Steve Block    else:
155d0825bca7fe65beaee391d30da42e937db621564Steve Block        if cls is None:
156d0825bca7fe65beaee391d30da42e937db621564Steve Block            cls = JSONEncoder
157d0825bca7fe65beaee391d30da42e937db621564Steve Block        iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii,
158d0825bca7fe65beaee391d30da42e937db621564Steve Block            check_circular=check_circular, allow_nan=allow_nan, indent=indent,
159d0825bca7fe65beaee391d30da42e937db621564Steve Block            separators=separators, encoding=encoding, **kw).iterencode(obj)
160d0825bca7fe65beaee391d30da42e937db621564Steve Block    # could accelerate with writelines in some versions of Python, at
161d0825bca7fe65beaee391d30da42e937db621564Steve Block    # a debuggability cost
162d0825bca7fe65beaee391d30da42e937db621564Steve Block    for chunk in iterable:
163d0825bca7fe65beaee391d30da42e937db621564Steve Block        fp.write(chunk)
164d0825bca7fe65beaee391d30da42e937db621564Steve Block
165d0825bca7fe65beaee391d30da42e937db621564Steve Block
166d0825bca7fe65beaee391d30da42e937db621564Steve Blockdef dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
167d0825bca7fe65beaee391d30da42e937db621564Steve Block        allow_nan=True, cls=None, indent=None, separators=None,
168d0825bca7fe65beaee391d30da42e937db621564Steve Block        encoding='utf-8', **kw):
169d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
170d0825bca7fe65beaee391d30da42e937db621564Steve Block    Serialize ``obj`` to a JSON formatted ``str``.
171d0825bca7fe65beaee391d30da42e937db621564Steve Block
172d0825bca7fe65beaee391d30da42e937db621564Steve Block    If ``skipkeys`` is ``True`` then ``dict`` keys that are not basic types
173d0825bca7fe65beaee391d30da42e937db621564Steve Block    (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``)
174d0825bca7fe65beaee391d30da42e937db621564Steve Block    will be skipped instead of raising a ``TypeError``.
175d0825bca7fe65beaee391d30da42e937db621564Steve Block
176d0825bca7fe65beaee391d30da42e937db621564Steve Block    If ``ensure_ascii`` is ``False``, then the return value will be a
177d0825bca7fe65beaee391d30da42e937db621564Steve Block    ``unicode`` instance subject to normal Python ``str`` to ``unicode``
178d0825bca7fe65beaee391d30da42e937db621564Steve Block    coercion rules instead of being escaped to an ASCII ``str``.
179d0825bca7fe65beaee391d30da42e937db621564Steve Block
180d0825bca7fe65beaee391d30da42e937db621564Steve Block    If ``check_circular`` is ``False``, then the circular reference check
181d0825bca7fe65beaee391d30da42e937db621564Steve Block    for container types will be skipped and a circular reference will
182d0825bca7fe65beaee391d30da42e937db621564Steve Block    result in an ``OverflowError`` (or worse).
183d0825bca7fe65beaee391d30da42e937db621564Steve Block
184d0825bca7fe65beaee391d30da42e937db621564Steve Block    If ``allow_nan`` is ``False``, then it will be a ``ValueError`` to
185d0825bca7fe65beaee391d30da42e937db621564Steve Block    serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in
186d0825bca7fe65beaee391d30da42e937db621564Steve Block    strict compliance of the JSON specification, instead of using the
187d0825bca7fe65beaee391d30da42e937db621564Steve Block    JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
188d0825bca7fe65beaee391d30da42e937db621564Steve Block
189d0825bca7fe65beaee391d30da42e937db621564Steve Block    If ``indent`` is a non-negative integer, then JSON array elements and
190d0825bca7fe65beaee391d30da42e937db621564Steve Block    object members will be pretty-printed with that indent level. An indent
191d0825bca7fe65beaee391d30da42e937db621564Steve Block    level of 0 will only insert newlines. ``None`` is the most compact
192d0825bca7fe65beaee391d30da42e937db621564Steve Block    representation.
193d0825bca7fe65beaee391d30da42e937db621564Steve Block
194d0825bca7fe65beaee391d30da42e937db621564Steve Block    If ``separators`` is an ``(item_separator, dict_separator)`` tuple
195d0825bca7fe65beaee391d30da42e937db621564Steve Block    then it will be used instead of the default ``(', ', ': ')`` separators.
196d0825bca7fe65beaee391d30da42e937db621564Steve Block    ``(',', ':')`` is the most compact JSON representation.
197d0825bca7fe65beaee391d30da42e937db621564Steve Block
198d0825bca7fe65beaee391d30da42e937db621564Steve Block    ``encoding`` is the character encoding for str instances, default is UTF-8.
199d0825bca7fe65beaee391d30da42e937db621564Steve Block
200d0825bca7fe65beaee391d30da42e937db621564Steve Block    To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
201d0825bca7fe65beaee391d30da42e937db621564Steve Block    ``.default()`` method to serialize additional types), specify it with
202d0825bca7fe65beaee391d30da42e937db621564Steve Block    the ``cls`` kwarg.
203d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
204d0825bca7fe65beaee391d30da42e937db621564Steve Block    # cached encoder
205d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (skipkeys is False and ensure_ascii is True and
206d0825bca7fe65beaee391d30da42e937db621564Steve Block        check_circular is True and allow_nan is True and
207d0825bca7fe65beaee391d30da42e937db621564Steve Block        cls is None and indent is None and separators is None and
208d0825bca7fe65beaee391d30da42e937db621564Steve Block        encoding == 'utf-8' and not kw):
209d0825bca7fe65beaee391d30da42e937db621564Steve Block        return _default_encoder.encode(obj)
210d0825bca7fe65beaee391d30da42e937db621564Steve Block    if cls is None:
211d0825bca7fe65beaee391d30da42e937db621564Steve Block        cls = JSONEncoder
212d0825bca7fe65beaee391d30da42e937db621564Steve Block    return cls(
213d0825bca7fe65beaee391d30da42e937db621564Steve Block        skipkeys=skipkeys, ensure_ascii=ensure_ascii,
214d0825bca7fe65beaee391d30da42e937db621564Steve Block        check_circular=check_circular, allow_nan=allow_nan, indent=indent,
215d0825bca7fe65beaee391d30da42e937db621564Steve Block        separators=separators, encoding=encoding,
216d0825bca7fe65beaee391d30da42e937db621564Steve Block        **kw).encode(obj)
217d0825bca7fe65beaee391d30da42e937db621564Steve Block
218d0825bca7fe65beaee391d30da42e937db621564Steve Block_default_decoder = JSONDecoder(encoding=None, object_hook=None)
219d0825bca7fe65beaee391d30da42e937db621564Steve Block
220d0825bca7fe65beaee391d30da42e937db621564Steve Blockdef load(fp, encoding=None, cls=None, object_hook=None, **kw):
221d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
222d0825bca7fe65beaee391d30da42e937db621564Steve Block    Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
223d0825bca7fe65beaee391d30da42e937db621564Steve Block    a JSON document) to a Python object.
224d0825bca7fe65beaee391d30da42e937db621564Steve Block
225d0825bca7fe65beaee391d30da42e937db621564Steve Block    If the contents of ``fp`` is encoded with an ASCII based encoding other
226d0825bca7fe65beaee391d30da42e937db621564Steve Block    than utf-8 (e.g. latin-1), then an appropriate ``encoding`` name must
227d0825bca7fe65beaee391d30da42e937db621564Steve Block    be specified. Encodings that are not ASCII based (such as UCS-2) are
228d0825bca7fe65beaee391d30da42e937db621564Steve Block    not allowed, and should be wrapped with
229d0825bca7fe65beaee391d30da42e937db621564Steve Block    ``codecs.getreader(fp)(encoding)``, or simply decoded to a ``unicode``
230d0825bca7fe65beaee391d30da42e937db621564Steve Block    object and passed to ``loads()``
231d0825bca7fe65beaee391d30da42e937db621564Steve Block
232d0825bca7fe65beaee391d30da42e937db621564Steve Block    ``object_hook`` is an optional function that will be called with the
233d0825bca7fe65beaee391d30da42e937db621564Steve Block    result of any object literal decode (a ``dict``). The return value of
234d0825bca7fe65beaee391d30da42e937db621564Steve Block    ``object_hook`` will be used instead of the ``dict``. This feature
235d0825bca7fe65beaee391d30da42e937db621564Steve Block    can be used to implement custom decoders (e.g. JSON-RPC class hinting).
236d0825bca7fe65beaee391d30da42e937db621564Steve Block
237d0825bca7fe65beaee391d30da42e937db621564Steve Block    To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
238d0825bca7fe65beaee391d30da42e937db621564Steve Block    kwarg.
239d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
240d0825bca7fe65beaee391d30da42e937db621564Steve Block    return loads(fp.read(),
241d0825bca7fe65beaee391d30da42e937db621564Steve Block        encoding=encoding, cls=cls, object_hook=object_hook, **kw)
242d0825bca7fe65beaee391d30da42e937db621564Steve Block
243d0825bca7fe65beaee391d30da42e937db621564Steve Blockdef loads(s, encoding=None, cls=None, object_hook=None, **kw):
244d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
245d0825bca7fe65beaee391d30da42e937db621564Steve Block    Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON
246d0825bca7fe65beaee391d30da42e937db621564Steve Block    document) to a Python object.
247d0825bca7fe65beaee391d30da42e937db621564Steve Block
248d0825bca7fe65beaee391d30da42e937db621564Steve Block    If ``s`` is a ``str`` instance and is encoded with an ASCII based encoding
249d0825bca7fe65beaee391d30da42e937db621564Steve Block    other than utf-8 (e.g. latin-1) then an appropriate ``encoding`` name
250d0825bca7fe65beaee391d30da42e937db621564Steve Block    must be specified. Encodings that are not ASCII based (such as UCS-2)
251d0825bca7fe65beaee391d30da42e937db621564Steve Block    are not allowed and should be decoded to ``unicode`` first.
252d0825bca7fe65beaee391d30da42e937db621564Steve Block
253d0825bca7fe65beaee391d30da42e937db621564Steve Block    ``object_hook`` is an optional function that will be called with the
254d0825bca7fe65beaee391d30da42e937db621564Steve Block    result of any object literal decode (a ``dict``). The return value of
255d0825bca7fe65beaee391d30da42e937db621564Steve Block    ``object_hook`` will be used instead of the ``dict``. This feature
256d0825bca7fe65beaee391d30da42e937db621564Steve Block    can be used to implement custom decoders (e.g. JSON-RPC class hinting).
257d0825bca7fe65beaee391d30da42e937db621564Steve Block
258d0825bca7fe65beaee391d30da42e937db621564Steve Block    To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
259d0825bca7fe65beaee391d30da42e937db621564Steve Block    kwarg.
260d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
261d0825bca7fe65beaee391d30da42e937db621564Steve Block    if cls is None and encoding is None and object_hook is None and not kw:
262d0825bca7fe65beaee391d30da42e937db621564Steve Block        return _default_decoder.decode(s)
263d0825bca7fe65beaee391d30da42e937db621564Steve Block    if cls is None:
264d0825bca7fe65beaee391d30da42e937db621564Steve Block        cls = JSONDecoder
265d0825bca7fe65beaee391d30da42e937db621564Steve Block    if object_hook is not None:
266d0825bca7fe65beaee391d30da42e937db621564Steve Block        kw['object_hook'] = object_hook
267d0825bca7fe65beaee391d30da42e937db621564Steve Block    return cls(encoding=encoding, **kw).decode(s)
268d0825bca7fe65beaee391d30da42e937db621564Steve Block
269d0825bca7fe65beaee391d30da42e937db621564Steve Blockdef read(s):
270d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
271d0825bca7fe65beaee391d30da42e937db621564Steve Block    json-py API compatibility hook. Use loads(s) instead.
272d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
273d0825bca7fe65beaee391d30da42e937db621564Steve Block    import warnings
274d0825bca7fe65beaee391d30da42e937db621564Steve Block    warnings.warn("simplejson.loads(s) should be used instead of read(s)",
275d0825bca7fe65beaee391d30da42e937db621564Steve Block        DeprecationWarning)
276d0825bca7fe65beaee391d30da42e937db621564Steve Block    return loads(s)
277d0825bca7fe65beaee391d30da42e937db621564Steve Block
278d0825bca7fe65beaee391d30da42e937db621564Steve Blockdef write(obj):
279d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
280d0825bca7fe65beaee391d30da42e937db621564Steve Block    json-py API compatibility hook. Use dumps(s) instead.
281d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
282d0825bca7fe65beaee391d30da42e937db621564Steve Block    import warnings
283d0825bca7fe65beaee391d30da42e937db621564Steve Block    warnings.warn("simplejson.dumps(s) should be used instead of write(s)",
284d0825bca7fe65beaee391d30da42e937db621564Steve Block        DeprecationWarning)
285d0825bca7fe65beaee391d30da42e937db621564Steve Block    return dumps(obj)
286d0825bca7fe65beaee391d30da42e937db621564Steve Block
287d0825bca7fe65beaee391d30da42e937db621564Steve Block
288