94 lines
4 KiB
Python
94 lines
4 KiB
Python
from __future__ import absolute_import
|
|
from .error import Error
|
|
from .loader import DirtyJSONLoader
|
|
|
|
r"""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:`dirtyjson` exposes an API familiar to users of the standard library
|
|
:mod:`marshal` and :mod:`pickle` modules. It is the externally maintained
|
|
version of the :mod:`json` library contained in Python 2.6, but maintains
|
|
compatibility with Python 2.4 and Python 2.5 and (currently) has
|
|
significant performance advantages, even without using the optional C
|
|
extension for speedups.
|
|
|
|
Decoding JSON::
|
|
|
|
>>> import dirtyjson
|
|
>>> obj = [u'foo', {u'bar': [u'baz', None, 1.0, 2]}]
|
|
>>> dirtyjson.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') == obj
|
|
True
|
|
>>> dirtyjson.loads('"\\"foo\\bar"') == u'"foo\x08ar'
|
|
True
|
|
>>> from dirtyjson.compat import StringIO
|
|
>>> io = StringIO('["streaming API"]')
|
|
>>> dirtyjson.load(io)[0] == 'streaming API'
|
|
True
|
|
|
|
"""
|
|
__all__ = ['load', 'loads', 'Error']
|
|
|
|
__author__ = 'Scott Maxwell <scott@codecobblers.com>'
|
|
|
|
|
|
def load(fp, encoding=None, parse_float=None, parse_int=None,
|
|
parse_constant=None, search_for_first_object=False):
|
|
"""Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
|
|
a JSON document) to a Python object.
|
|
|
|
*encoding* determines the encoding used to interpret any
|
|
:class:`str` objects decoded by this instance (``'utf-8'`` by
|
|
default). It has no effect when decoding :class:`unicode` objects.
|
|
|
|
Note that currently only encodings that are a superset of ASCII work,
|
|
strings of other encodings should be passed in as :class:`unicode`.
|
|
|
|
*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 data type or parser
|
|
for JSON floats (e.g. :class:`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 data type or parser
|
|
for JSON integers (e.g. :class:`float`).
|
|
|
|
*parse_constant*, if specified, will be called with one of the
|
|
following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This
|
|
can be used to raise an exception if invalid JSON numbers are
|
|
encountered.
|
|
"""
|
|
return loads(fp.read(), encoding, parse_float, parse_int, parse_constant,
|
|
search_for_first_object)
|
|
|
|
|
|
def loads(s, encoding=None, parse_float=None, parse_int=None,
|
|
parse_constant=None, search_for_first_object=False, start_index=0):
|
|
"""Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON
|
|
document) to a Python object.
|
|
|
|
*encoding* determines the encoding used to interpret any
|
|
:class:`str` objects decoded by this instance (``'utf-8'`` by
|
|
default). It has no effect when decoding :class:`unicode` objects.
|
|
|
|
Note that currently only encodings that are a superset of ASCII work,
|
|
strings of other encodings should be passed in as :class:`unicode`.
|
|
|
|
*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 data type or parser
|
|
for JSON floats (e.g. :class:`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 data type or parser
|
|
for JSON integers (e.g. :class:`float`).
|
|
|
|
*parse_constant*, if specified, will be called with one of the
|
|
following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This
|
|
can be used to raise an exception if invalid JSON numbers are
|
|
encountered.
|
|
"""
|
|
d = DirtyJSONLoader(s, encoding, parse_float, parse_int, parse_constant)
|
|
return d.decode(search_for_first_object, start_index)
|