web/lib/django/utils/simplejson/__init__.py
changeset 0 0d40e90630ef
equal deleted inserted replaced
-1:000000000000 0:0d40e90630ef
       
     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)