__init__.py 11.2 KB
Newer Older
1
r"""JSON (JavaScript Object Notation) <http://json.org> is a subset of
2 3 4
JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data
interchange format.

5 6 7 8 9 10
:mod:`json` 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.
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

Encoding basic Python object hierarchies::

    >>> import json
    >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
    '["foo", {"bar": ["baz", null, 1.0, 2]}]'
    >>> print(json.dumps("\"foo\bar"))
    "\"foo\bar"
    >>> print(json.dumps('\u1234'))
    "\u1234"
    >>> print(json.dumps('\\'))
    "\\"
    >>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
    {"a": 0, "b": 0, "c": 0}
    >>> from io import StringIO
    >>> io = StringIO()
    >>> json.dump(['streaming API'], io)
    >>> io.getvalue()
    '["streaming API"]'

Compact encoding::

    >>> import json
    >>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',',':'))
    '[1,2,3,{"4":5,"6":7}]'

37
Pretty printing::
38 39

    >>> import json
40 41 42 43 44 45
    >>> s = json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
    >>> print('\n'.join([l.rstrip() for l in  s.splitlines()]))
    {
        "4": 5,
        "6": 7
    }
46 47 48 49

Decoding JSON::

    >>> import json
50 51 52 53 54
    >>> obj = ['foo', {'bar': ['baz', None, 1.0, 2]}]
    >>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') == obj
    True
    >>> json.loads('"\\"foo\\bar"') == '"foo\x08ar'
    True
55 56
    >>> from io import StringIO
    >>> io = StringIO('["streaming API"]')
57 58
    >>> json.load(io)[0] == 'streaming API'
    True
59 60 61 62 63 64 65 66 67 68 69 70

Specializing JSON object decoding::

    >>> import json
    >>> def as_complex(dct):
    ...     if '__complex__' in dct:
    ...         return complex(dct['real'], dct['imag'])
    ...     return dct
    ...
    >>> json.loads('{"__complex__": true, "real": 1, "imag": 2}',
    ...     object_hook=as_complex)
    (1+2j)
71 72 73
    >>> from decimal import Decimal
    >>> json.loads('1.1', parse_float=Decimal) == Decimal('1.1')
    True
74

75
Specializing JSON object encoding::
76 77

    >>> import json
78 79 80 81
    >>> def encode_complex(obj):
    ...     if isinstance(obj, complex):
    ...         return [obj.real, obj.imag]
    ...     raise TypeError(repr(o) + " is not JSON serializable")
82
    ...
83 84 85
    >>> json.dumps(2 + 1j, default=encode_complex)
    '[2.0, 1.0]'
    >>> json.JSONEncoder(default=encode_complex).encode(2 + 1j)
86
    '[2.0, 1.0]'
87
    >>> ''.join(json.JSONEncoder(default=encode_complex).iterencode(2 + 1j))
88 89 90
    '[2.0, 1.0]'


91
Using json.tool from the shell to validate and pretty-print::
92

93
    $ echo '{"json":"obj"}' | python -m json.tool
94 95 96
    {
        "json": "obj"
    }
97
    $ echo '{ 1.2:3.4}' | python -m json.tool
98 99
    Expecting property name: line 1 column 2 (char 2)
"""
100
__version__ = '2.0.9'
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
__all__ = [
    'dump', 'dumps', 'load', 'loads',
    'JSONDecoder', 'JSONEncoder',
]

__author__ = 'Bob Ippolito <bob@redivi.com>'

from .decoder import JSONDecoder
from .encoder import JSONEncoder

_default_encoder = JSONEncoder(
    skipkeys=False,
    ensure_ascii=True,
    check_circular=True,
    allow_nan=True,
    indent=None,
    separators=None,
    default=None,
)

def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
        allow_nan=True, cls=None, indent=None, separators=None,
123
        default=None, **kw):
124 125 126
    """Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
    ``.write()``-supporting file-like object).

127 128 129
    If ``skipkeys`` is true then ``dict`` keys that are not basic types
    (``str``, ``unicode``, ``int``, ``float``, ``bool``, ``None``) will be
    skipped instead of raising a ``TypeError``.
130

131
    If ``ensure_ascii`` is false, then the some chunks written to ``fp``
132 133 134 135 136
    may be ``unicode`` instances, subject to normal Python ``str`` to
    ``unicode`` coercion rules. Unless ``fp.write()`` explicitly
    understands ``unicode`` (as in ``codecs.getwriter()``) this is likely
    to cause an error.

137
    If ``check_circular`` is false, then the circular reference check
138 139 140
    for container types will be skipped and a circular reference will
    result in an ``OverflowError`` (or worse).

141
    If ``allow_nan`` is false, then it will be a ``ValueError`` to
142 143 144 145
    serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``)
    in strict compliance of the JSON specification, instead of using the
    JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).

146 147 148 149
    If ``indent`` is a non-negative integer, then JSON array elements and
    object members will be pretty-printed with that indent level. An indent
    level of 0 will only insert newlines. ``None`` is the most compact
    representation.
150 151 152 153 154 155 156 157 158 159 160 161 162 163

    If ``separators`` is an ``(item_separator, dict_separator)`` tuple
    then it will be used instead of the default ``(', ', ': ')`` separators.
    ``(',', ':')`` is the most compact JSON representation.

    ``default(obj)`` is a function that should return a serializable version
    of obj or raise TypeError. The default simply raises TypeError.

    To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
    ``.default()`` method to serialize additional types), specify it with
    the ``cls`` kwarg.

    """
    # cached encoder
164 165
    if (not skipkeys and ensure_ascii and
        check_circular and allow_nan and
166
        cls is None and indent is None and separators is None and
167
        default is None and not kw):
168 169 170 171 172 173
        iterable = _default_encoder.iterencode(obj)
    else:
        if cls is None:
            cls = JSONEncoder
        iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii,
            check_circular=check_circular, allow_nan=allow_nan, indent=indent,
174
            separators=separators,
175 176 177 178 179 180 181 182 183
            default=default, **kw).iterencode(obj)
    # could accelerate with writelines in some versions of Python, at
    # a debuggability cost
    for chunk in iterable:
        fp.write(chunk)


def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
        allow_nan=True, cls=None, indent=None, separators=None,
184
        default=None, **kw):
185 186
    """Serialize ``obj`` to a JSON formatted ``str``.

187 188 189
    If ``skipkeys`` is false then ``dict`` keys that are not basic types
    (``str``, ``unicode``, ``int``, ``float``, ``bool``, ``None``) will be
    skipped instead of raising a ``TypeError``.
190

191
    If ``ensure_ascii`` is false, then the return value will be a
192 193 194
    ``unicode`` instance subject to normal Python ``str`` to ``unicode``
    coercion rules instead of being escaped to an ASCII ``str``.

195
    If ``check_circular`` is false, then the circular reference check
196 197 198
    for container types will be skipped and a circular reference will
    result in an ``OverflowError`` (or worse).

199
    If ``allow_nan`` is false, then it will be a ``ValueError`` to
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
    serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in
    strict compliance of the JSON specification, instead of using the
    JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).

    If ``indent`` is a non-negative integer, then JSON array elements and
    object members will be pretty-printed with that indent level. An indent
    level of 0 will only insert newlines. ``None`` is the most compact
    representation.

    If ``separators`` is an ``(item_separator, dict_separator)`` tuple
    then it will be used instead of the default ``(', ', ': ')`` separators.
    ``(',', ':')`` is the most compact JSON representation.

    ``default(obj)`` is a function that should return a serializable version
    of obj or raise TypeError. The default simply raises TypeError.

    To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
    ``.default()`` method to serialize additional types), specify it with
    the ``cls`` kwarg.

    """
    # cached encoder
222 223
    if (not skipkeys and ensure_ascii and
        check_circular and allow_nan and
224
        cls is None and indent is None and separators is None and
225
        default is None and not kw):
226 227 228 229 230 231
        return _default_encoder.encode(obj)
    if cls is None:
        cls = JSONEncoder
    return cls(
        skipkeys=skipkeys, ensure_ascii=ensure_ascii,
        check_circular=check_circular, allow_nan=allow_nan, indent=indent,
232
        separators=separators, default=default,
233 234 235
        **kw).encode(obj)


236
_default_decoder = JSONDecoder(object_hook=None, object_pairs_hook=None)
237 238


239
def load(fp, cls=None, object_hook=None, parse_float=None,
240
        parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
241 242
    """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
    a JSON document) to a Python object.
243 244 245 246 247 248 249 250 251 252 253

    ``object_hook`` is an optional function that will be called with the
    result of any object literal decode (a ``dict``). The return value of
    ``object_hook`` will be used instead of the ``dict``. This feature
    can be used to implement custom decoders (e.g. JSON-RPC class hinting).

    To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
    kwarg.

    """
    return loads(fp.read(),
254
        cls=cls, object_hook=object_hook,
255
        parse_float=parse_float, parse_int=parse_int,
256
        parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
257 258 259


def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None,
260
        parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
261
    """Deserialize ``s`` (a ``str`` instance containing a JSON
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
    document) to a Python object.

    ``object_hook`` is an optional function that will be called with the
    result of any object literal decode (a ``dict``). The return value of
    ``object_hook`` will be used instead of the ``dict``. This feature
    can be used to implement custom decoders (e.g. JSON-RPC class hinting).

    ``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 datatype or parser
    for JSON floats (e.g. 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 datatype or parser
    for JSON integers (e.g. float).

    ``parse_constant``, if specified, will be called with one of the
    following strings: -Infinity, Infinity, NaN, null, true, false.
    This can be used to raise an exception if invalid JSON numbers
    are encountered.

    To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
    kwarg.

    """
288
    if (cls is None and object_hook is None and
289
            parse_int is None and parse_float is None and
290
            parse_constant is None and object_pairs_hook is None and not kw):
291 292 293 294 295
        return _default_decoder.decode(s)
    if cls is None:
        cls = JSONDecoder
    if object_hook is not None:
        kw['object_hook'] = object_hook
296 297
    if object_pairs_hook is not None:
        kw['object_pairs_hook'] = object_pairs_hook
298 299 300 301 302 303
    if parse_float is not None:
        kw['parse_float'] = parse_float
    if parse_int is not None:
        kw['parse_int'] = parse_int
    if parse_constant is not None:
        kw['parse_constant'] = parse_constant
304
    return cls(**kw).decode(s)