|
0
|
1 |
r"""JSON (JavaScript Object Notation) <http://json.org> is a subset of |
|
|
2 |
JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data |
|
|
3 |
interchange format. |
|
|
4 |
|
|
|
5 |
:mod:`simplejson` exposes an API familiar to users of the standard library |
|
|
6 |
:mod:`marshal` and :mod:`pickle` modules. It is the externally maintained |
|
|
7 |
version of the :mod:`json` library contained in Python 2.6, but maintains |
|
|
8 |
compatibility with Python 2.4 and Python 2.5 and (currently) has |
|
|
9 |
significant performance advantages, even without using the optional C |
|
|
10 |
extension for speedups. |
|
|
11 |
|
|
|
12 |
Encoding basic Python object hierarchies:: |
|
|
13 |
|
|
|
14 |
>>> import simplejson as json |
|
|
15 |
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) |
|
|
16 |
'["foo", {"bar": ["baz", null, 1.0, 2]}]' |
|
|
17 |
>>> print json.dumps("\"foo\bar") |
|
|
18 |
"\"foo\bar" |
|
|
19 |
>>> print json.dumps(u'\u1234') |
|
|
20 |
"\u1234" |
|
|
21 |
>>> print json.dumps('\\') |
|
|
22 |
"\\" |
|
|
23 |
>>> print json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True) |
|
|
24 |
{"a": 0, "b": 0, "c": 0} |
|
|
25 |
>>> from StringIO import StringIO |
|
|
26 |
>>> io = StringIO() |
|
|
27 |
>>> json.dump(['streaming API'], io) |
|
|
28 |
>>> io.getvalue() |
|
|
29 |
'["streaming API"]' |
|
|
30 |
|
|
|
31 |
Compact encoding:: |
|
|
32 |
|
|
|
33 |
>>> import simplejson as json |
|
|
34 |
>>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',',':')) |
|
|
35 |
'[1,2,3,{"4":5,"6":7}]' |
|
|
36 |
|
|
|
37 |
Pretty printing:: |
|
|
38 |
|
|
|
39 |
>>> import simplejson as json |
|
|
40 |
>>> s = json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4) |
|
|
41 |
>>> print '\n'.join([l.rstrip() for l in s.splitlines()]) |
|
|
42 |
{ |
|
|
43 |
"4": 5, |
|
|
44 |
"6": 7 |
|
|
45 |
} |
|
|
46 |
|
|
|
47 |
Decoding JSON:: |
|
|
48 |
|
|
|
49 |
>>> import simplejson as json |
|
|
50 |
>>> obj = [u'foo', {u'bar': [u'baz', None, 1.0, 2]}] |
|
|
51 |
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') == obj |
|
|
52 |
True |
|
|
53 |
>>> json.loads('"\\"foo\\bar"') == u'"foo\x08ar' |
|
|
54 |
True |
|
|
55 |
>>> from StringIO import StringIO |
|
|
56 |
>>> io = StringIO('["streaming API"]') |
|
|
57 |
>>> json.load(io)[0] == 'streaming API' |
|
|
58 |
True |
|
|
59 |
|
|
|
60 |
Specializing JSON object decoding:: |
|
|
61 |
|
|
|
62 |
>>> import simplejson as json |
|
|
63 |
>>> def as_complex(dct): |
|
|
64 |
... if '__complex__' in dct: |
|
|
65 |
... return complex(dct['real'], dct['imag']) |
|
|
66 |
... return dct |
|
|
67 |
... |
|
|
68 |
>>> json.loads('{"__complex__": true, "real": 1, "imag": 2}', |
|
|
69 |
... object_hook=as_complex) |
|
|
70 |
(1+2j) |
|
|
71 |
>>> import decimal |
|
|
72 |
>>> json.loads('1.1', parse_float=decimal.Decimal) == decimal.Decimal('1.1') |
|
|
73 |
True |
|
|
74 |
|
|
|
75 |
Specializing JSON object encoding:: |
|
|
76 |
|
|
|
77 |
>>> import simplejson as json |
|
|
78 |
>>> def encode_complex(obj): |
|
|
79 |
... if isinstance(obj, complex): |
|
|
80 |
... return [obj.real, obj.imag] |
|
|
81 |
... raise TypeError("%r is not JSON serializable" % (o,)) |
|
|
82 |
... |
|
|
83 |
>>> json.dumps(2 + 1j, default=encode_complex) |
|
|
84 |
'[2.0, 1.0]' |
|
|
85 |
>>> json.JSONEncoder(default=encode_complex).encode(2 + 1j) |
|
|
86 |
'[2.0, 1.0]' |
|
|
87 |
>>> ''.join(json.JSONEncoder(default=encode_complex).iterencode(2 + 1j)) |
|
|
88 |
'[2.0, 1.0]' |
|
|
89 |
|
|
|
90 |
|
|
|
91 |
Using simplejson.tool from the shell to validate and pretty-print:: |
|
|
92 |
|
|
|
93 |
$ echo '{"json":"obj"}' | python -msimplejson.tool |
|
|
94 |
{ |
|
|
95 |
"json": "obj" |
|
|
96 |
} |
|
|
97 |
$ echo '{ 1.2:3.4}' | python -msimplejson.tool |
|
|
98 |
Expecting property name: line 1 column 2 (char 2) |
|
|
99 |
""" |
|
|
100 |
|
|
|
101 |
# Django modification: try to use the system version first, providing it's |
|
|
102 |
# either of a later version of has the C speedups in place. Otherwise, fall |
|
|
103 |
# back to our local copy. |
|
|
104 |
|
|
|
105 |
__version__ = '2.0.7' |
|
|
106 |
|
|
|
107 |
use_system_version = False |
|
|
108 |
try: |
|
|
109 |
# The system-installed version has priority providing it is either not an |
|
|
110 |
# earlier version or it contains the C speedups. |
|
|
111 |
import simplejson |
|
|
112 |
if (simplejson.__version__.split('.') >= __version__.split('.') or |
|
|
113 |
hasattr(simplejson, '_speedups')): |
|
|
114 |
from simplejson import * |
|
|
115 |
use_system_version = True |
|
|
116 |
except ImportError: |
|
|
117 |
pass |
|
|
118 |
|
|
|
119 |
if not use_system_version: |
|
|
120 |
try: |
|
|
121 |
from json import * # Python 2.6 preferred over local copy. |
|
|
122 |
|
|
|
123 |
# There is a "json" package around that is not Python's "json", so we |
|
|
124 |
# check for something that is only in the namespace of the version we |
|
|
125 |
# want. |
|
|
126 |
JSONDecoder |
|
|
127 |
|
|
|
128 |
use_system_version = True |
|
|
129 |
except (ImportError, NameError): |
|
|
130 |
pass |
|
|
131 |
|
|
|
132 |
# If all else fails, we have a bundled version that can be used. |
|
|
133 |
if not use_system_version: |
|
|
134 |
__all__ = [ |
|
|
135 |
'dump', 'dumps', 'load', 'loads', |
|
|
136 |
'JSONDecoder', 'JSONEncoder', |
|
|
137 |
] |
|
|
138 |
|
|
|
139 |
from django.utils.simplejson.decoder import JSONDecoder |
|
|
140 |
from django.utils.simplejson.encoder import JSONEncoder |
|
|
141 |
|
|
|
142 |
_default_encoder = JSONEncoder( |
|
|
143 |
skipkeys=False, |
|
|
144 |
ensure_ascii=True, |
|
|
145 |
check_circular=True, |
|
|
146 |
allow_nan=True, |
|
|
147 |
indent=None, |
|
|
148 |
separators=None, |
|
|
149 |
encoding='utf-8', |
|
|
150 |
default=None, |
|
|
151 |
) |
|
|
152 |
|
|
|
153 |
def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, |
|
|
154 |
allow_nan=True, cls=None, indent=None, separators=None, |
|
|
155 |
encoding='utf-8', default=None, **kw): |
|
|
156 |
"""Serialize ``obj`` as a JSON formatted stream to ``fp`` (a |
|
|
157 |
``.write()``-supporting file-like object). |
|
|
158 |
|
|
|
159 |
If ``skipkeys`` is ``True`` then ``dict`` keys that are not basic types |
|
|
160 |
(``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) |
|
|
161 |
will be skipped instead of raising a ``TypeError``. |
|
|
162 |
|
|
|
163 |
If ``ensure_ascii`` is ``False``, then the some chunks written to ``fp`` |
|
|
164 |
may be ``unicode`` instances, subject to normal Python ``str`` to |
|
|
165 |
``unicode`` coercion rules. Unless ``fp.write()`` explicitly |
|
|
166 |
understands ``unicode`` (as in ``codecs.getwriter()``) this is likely |
|
|
167 |
to cause an error. |
|
|
168 |
|
|
|
169 |
If ``check_circular`` is ``False``, then the circular reference check |
|
|
170 |
for container types will be skipped and a circular reference will |
|
|
171 |
result in an ``OverflowError`` (or worse). |
|
|
172 |
|
|
|
173 |
If ``allow_nan`` is ``False``, then it will be a ``ValueError`` to |
|
|
174 |
serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) |
|
|
175 |
in strict compliance of the JSON specification, instead of using the |
|
|
176 |
JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). |
|
|
177 |
|
|
|
178 |
If ``indent`` is a non-negative integer, then JSON array elements and object |
|
|
179 |
members will be pretty-printed with that indent level. An indent level |
|
|
180 |
of 0 will only insert newlines. ``None`` is the most compact representation. |
|
|
181 |
|
|
|
182 |
If ``separators`` is an ``(item_separator, dict_separator)`` tuple |
|
|
183 |
then it will be used instead of the default ``(', ', ': ')`` separators. |
|
|
184 |
``(',', ':')`` is the most compact JSON representation. |
|
|
185 |
|
|
|
186 |
``encoding`` is the character encoding for str instances, default is UTF-8. |
|
|
187 |
|
|
|
188 |
``default(obj)`` is a function that should return a serializable version |
|
|
189 |
of obj or raise TypeError. The default simply raises TypeError. |
|
|
190 |
|
|
|
191 |
To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the |
|
|
192 |
``.default()`` method to serialize additional types), specify it with |
|
|
193 |
the ``cls`` kwarg. |
|
|
194 |
|
|
|
195 |
""" |
|
|
196 |
# cached encoder |
|
|
197 |
if (skipkeys is False and ensure_ascii is True and |
|
|
198 |
check_circular is True and allow_nan is True and |
|
|
199 |
cls is None and indent is None and separators is None and |
|
|
200 |
encoding == 'utf-8' and default is None and not kw): |
|
|
201 |
iterable = _default_encoder.iterencode(obj) |
|
|
202 |
else: |
|
|
203 |
if cls is None: |
|
|
204 |
cls = JSONEncoder |
|
|
205 |
iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii, |
|
|
206 |
check_circular=check_circular, allow_nan=allow_nan, indent=indent, |
|
|
207 |
separators=separators, encoding=encoding, |
|
|
208 |
default=default, **kw).iterencode(obj) |
|
|
209 |
# could accelerate with writelines in some versions of Python, at |
|
|
210 |
# a debuggability cost |
|
|
211 |
for chunk in iterable: |
|
|
212 |
fp.write(chunk) |
|
|
213 |
|
|
|
214 |
|
|
|
215 |
def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, |
|
|
216 |
allow_nan=True, cls=None, indent=None, separators=None, |
|
|
217 |
encoding='utf-8', default=None, **kw): |
|
|
218 |
"""Serialize ``obj`` to a JSON formatted ``str``. |
|
|
219 |
|
|
|
220 |
If ``skipkeys`` is ``True`` then ``dict`` keys that are not basic types |
|
|
221 |
(``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) |
|
|
222 |
will be skipped instead of raising a ``TypeError``. |
|
|
223 |
|
|
|
224 |
If ``ensure_ascii`` is ``False``, then the return value will be a |
|
|
225 |
``unicode`` instance subject to normal Python ``str`` to ``unicode`` |
|
|
226 |
coercion rules instead of being escaped to an ASCII ``str``. |
|
|
227 |
|
|
|
228 |
If ``check_circular`` is ``False``, then the circular reference check |
|
|
229 |
for container types will be skipped and a circular reference will |
|
|
230 |
result in an ``OverflowError`` (or worse). |
|
|
231 |
|
|
|
232 |
If ``allow_nan`` is ``False``, then it will be a ``ValueError`` to |
|
|
233 |
serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in |
|
|
234 |
strict compliance of the JSON specification, instead of using the |
|
|
235 |
JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). |
|
|
236 |
|
|
|
237 |
If ``indent`` is a non-negative integer, then JSON array elements and |
|
|
238 |
object members will be pretty-printed with that indent level. An indent |
|
|
239 |
level of 0 will only insert newlines. ``None`` is the most compact |
|
|
240 |
representation. |
|
|
241 |
|
|
|
242 |
If ``separators`` is an ``(item_separator, dict_separator)`` tuple |
|
|
243 |
then it will be used instead of the default ``(', ', ': ')`` separators. |
|
|
244 |
``(',', ':')`` is the most compact JSON representation. |
|
|
245 |
|
|
|
246 |
``encoding`` is the character encoding for str instances, default is UTF-8. |
|
|
247 |
|
|
|
248 |
``default(obj)`` is a function that should return a serializable version |
|
|
249 |
of obj or raise TypeError. The default simply raises TypeError. |
|
|
250 |
|
|
|
251 |
To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the |
|
|
252 |
``.default()`` method to serialize additional types), specify it with |
|
|
253 |
the ``cls`` kwarg. |
|
|
254 |
|
|
|
255 |
""" |
|
|
256 |
# cached encoder |
|
|
257 |
if (skipkeys is False and ensure_ascii is True and |
|
|
258 |
check_circular is True and allow_nan is True and |
|
|
259 |
cls is None and indent is None and separators is None and |
|
|
260 |
encoding == 'utf-8' and default is None and not kw): |
|
|
261 |
return _default_encoder.encode(obj) |
|
|
262 |
if cls is None: |
|
|
263 |
cls = JSONEncoder |
|
|
264 |
return cls( |
|
|
265 |
skipkeys=skipkeys, ensure_ascii=ensure_ascii, |
|
|
266 |
check_circular=check_circular, allow_nan=allow_nan, indent=indent, |
|
|
267 |
separators=separators, encoding=encoding, default=default, |
|
|
268 |
**kw).encode(obj) |
|
|
269 |
|
|
|
270 |
|
|
|
271 |
_default_decoder = JSONDecoder(encoding=None, object_hook=None) |
|
|
272 |
|
|
|
273 |
|
|
|
274 |
def load(fp, encoding=None, cls=None, object_hook=None, parse_float=None, |
|
|
275 |
parse_int=None, parse_constant=None, **kw): |
|
|
276 |
"""Deserialize ``fp`` (a ``.read()``-supporting file-like object containing |
|
|
277 |
a JSON document) to a Python object. |
|
|
278 |
|
|
|
279 |
If the contents of ``fp`` is encoded with an ASCII based encoding other |
|
|
280 |
than utf-8 (e.g. latin-1), then an appropriate ``encoding`` name must |
|
|
281 |
be specified. Encodings that are not ASCII based (such as UCS-2) are |
|
|
282 |
not allowed, and should be wrapped with |
|
|
283 |
``codecs.getreader(fp)(encoding)``, or simply decoded to a ``unicode`` |
|
|
284 |
object and passed to ``loads()`` |
|
|
285 |
|
|
|
286 |
``object_hook`` is an optional function that will be called with the |
|
|
287 |
result of any object literal decode (a ``dict``). The return value of |
|
|
288 |
``object_hook`` will be used instead of the ``dict``. This feature |
|
|
289 |
can be used to implement custom decoders (e.g. JSON-RPC class hinting). |
|
|
290 |
|
|
|
291 |
To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` |
|
|
292 |
kwarg. |
|
|
293 |
|
|
|
294 |
""" |
|
|
295 |
return loads(fp.read(), |
|
|
296 |
encoding=encoding, cls=cls, object_hook=object_hook, |
|
|
297 |
parse_float=parse_float, parse_int=parse_int, |
|
|
298 |
parse_constant=parse_constant, **kw) |
|
|
299 |
|
|
|
300 |
|
|
|
301 |
def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, |
|
|
302 |
parse_int=None, parse_constant=None, **kw): |
|
|
303 |
"""Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON |
|
|
304 |
document) to a Python object. |
|
|
305 |
|
|
|
306 |
If ``s`` is a ``str`` instance and is encoded with an ASCII based encoding |
|
|
307 |
other than utf-8 (e.g. latin-1) then an appropriate ``encoding`` name |
|
|
308 |
must be specified. Encodings that are not ASCII based (such as UCS-2) |
|
|
309 |
are not allowed and should be decoded to ``unicode`` first. |
|
|
310 |
|
|
|
311 |
``object_hook`` is an optional function that will be called with the |
|
|
312 |
result of any object literal decode (a ``dict``). The return value of |
|
|
313 |
``object_hook`` will be used instead of the ``dict``. This feature |
|
|
314 |
can be used to implement custom decoders (e.g. JSON-RPC class hinting). |
|
|
315 |
|
|
|
316 |
``parse_float``, if specified, will be called with the string |
|
|
317 |
of every JSON float to be decoded. By default this is equivalent to |
|
|
318 |
float(num_str). This can be used to use another datatype or parser |
|
|
319 |
for JSON floats (e.g. decimal.Decimal). |
|
|
320 |
|
|
|
321 |
``parse_int``, if specified, will be called with the string |
|
|
322 |
of every JSON int to be decoded. By default this is equivalent to |
|
|
323 |
int(num_str). This can be used to use another datatype or parser |
|
|
324 |
for JSON integers (e.g. float). |
|
|
325 |
|
|
|
326 |
``parse_constant``, if specified, will be called with one of the |
|
|
327 |
following strings: -Infinity, Infinity, NaN, null, true, false. |
|
|
328 |
This can be used to raise an exception if invalid JSON numbers |
|
|
329 |
are encountered. |
|
|
330 |
|
|
|
331 |
To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` |
|
|
332 |
kwarg. |
|
|
333 |
|
|
|
334 |
""" |
|
|
335 |
if (cls is None and encoding is None and object_hook is None and |
|
|
336 |
parse_int is None and parse_float is None and |
|
|
337 |
parse_constant is None and not kw): |
|
|
338 |
return _default_decoder.decode(s) |
|
|
339 |
if cls is None: |
|
|
340 |
cls = JSONDecoder |
|
|
341 |
if object_hook is not None: |
|
|
342 |
kw['object_hook'] = object_hook |
|
|
343 |
if parse_float is not None: |
|
|
344 |
kw['parse_float'] = parse_float |
|
|
345 |
if parse_int is not None: |
|
|
346 |
kw['parse_int'] = parse_int |
|
|
347 |
if parse_constant is not None: |
|
|
348 |
kw['parse_constant'] = parse_constant |
|
|
349 |
return cls(encoding=encoding, **kw).decode(s) |