json — JSON encoder and decoder¶
Source code: Lib/json/__init__.py
JSON (JavaScript Object Notation), specified by RFC 7159 (which obsoletes RFC 4627) and by ECMA-404, is a lightweight data interchange format inspired by JavaScript object literal syntax (although it is not a strict subset of JavaScript [1] ).
Note
The term “object” in the context of JSON processing in Python can be ambiguous. All values in Python are objects. In JSON, an object refers to any data wrapped in curly braces, similar to a Python dictionary.
Warning
Be cautious when parsing JSON data from untrusted sources. A malicious JSON string may cause the decoder to consume considerable CPU and memory resources. Limiting the size of data to be parsed is recommended.
This module exposes an API familiar to users of the standard library
marshal and pickle modules.
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}]'
Pretty printing:
>>> import json
>>> print(json.dumps({'6': 7, '4': 5}, sort_keys=True, indent=4))
{
"4": 5,
"6": 7
}
Customizing JSON object encoding:
>>> import json
>>> def custom_json(obj):
... if isinstance(obj, complex):
... return {'__complex__': True, 'real': obj.real, 'imag': obj.imag}
... raise TypeError(f'Cannot serialize object of {type(obj)}')
...
>>> json.dumps(1 + 2j, default=custom_json)
'{"__complex__": true, "real": 1.0, "imag": 2.0}'
Decoding JSON:
>>> import json
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
['foo', {'bar': ['baz', None, 1.0, 2]}]
>>> json.loads('"\\"foo\\bar"')
'"foo\x08ar'
>>> from io import StringIO
>>> io = StringIO('["streaming API"]')
>>> json.load(io)
['streaming API']
Customizing 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)
>>> import decimal
>>> json.loads('1.1', parse_float=decimal.Decimal)
Decimal('1.1')
Extending JSONEncoder:
>>> import json
>>> class ComplexEncoder(json.JSONEncoder):
... def default(self, obj):
... if isinstance(obj, complex):
... return [obj.real, obj.imag]
... # Let the base class default method raise the TypeError
... return super().default(obj)
...
>>> json.dumps(2 + 1j, cls=ComplexEncoder)
'[2.0, 1.0]'
>>> ComplexEncoder().encode(2 + 1j)
'[2.0, 1.0]'
>>> list(ComplexEncoder().iterencode(2 + 1j))
['[2.0', ', 1.0', ']']
Using json from the shell to validate and pretty-print:
$ echo '{"json":"obj"}' | python -m json
{
"json": "obj"
}
$ echo '{1.2:3.4}' | python -m json
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
See Command-line interface for detailed documentation.
Note
JSON is a subset of YAML 1.2. The JSON produced by this module’s default settings (in particular, the default separators value) is also a subset of YAML 1.0 and 1.1. This module can thus also be used as a YAML serializer.
Note
This module’s encoders and decoders preserve input and output order by default. Order is only lost if the underlying containers are unordered.
Basic Usage¶
- json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)¶
Serialize obj as a JSON formatted stream to fp (a
.write()-supporting file-like object) using this Python-to-JSON conversion table.Note
Unlike
pickleandmarshal, JSON is not a framed protocol, so trying to serialize multiple objects with repeated calls todump()using the same fp will result in an invalid JSON file.- Parameters:
obj (object) – The Python object to be serialized.
fp (file-like object) – The file-like object obj will be serialized to. The
jsonmodule always producesstrobjects, notbytesobjects, thereforefp.write()must supportstrinput.skipkeys (bool) – If
True, keys that are not of a basic type (str,int,float,bool,None) will be skipped instead of raising aTypeError. DefaultFalse.ensure_ascii (bool) – If
True(the default), the output is guaranteed to have all incoming non-ASCII and non-printable characters escaped. IfFalse, all characters will be outputted as-is, except for the characters that must be escaped: quotation mark, reverse solidus, and the control characters U+0000 through U+001F.check_circular (bool) – If
False, the circular reference check for container types is skipped and a circular reference will result in aRecursionError(or worse). DefaultTrue.allow_nan (bool) – If
False, serialization of out-of-rangefloatvalues (nan,inf,-inf) will result in aValueError, in strict compliance with the JSON specification. IfTrue(the default), their JavaScript equivalents (NaN,Infinity,-Infinity) are used.cls (a
JSONEncodersubclass) – If set, a custom JSON encoder with thedefault()method overridden, for serializing into custom datatypes. IfNone(the default),JSONEncoderis used.indent (int | str | None) – If a positive integer or string, JSON array elements and object members will be pretty-printed with that indent level. A positive integer indents that many spaces per level; a string (such as
"\t") is used to indent each level. If zero, negative, or""(the empty string), only newlines are inserted. IfNone(the default), no newlines are inserted.separators (tuple | None) – A two-tuple:
(item_separator, key_separator). IfNone(the default), separators defaults to(', ', ': ')if indent isNone, and(',', ': ')otherwise. For the most compact JSON, specify(',', ':')to eliminate whitespace.default (callable | None) – A function that is called for objects that can’t otherwise be serialized. It should return a JSON encodable version of the object or raise a
TypeError. IfNone(the default),TypeErroris raised.sort_keys (bool) – If
True, dictionaries will be outputted sorted by key. DefaultFalse.
Note
Keys in key/value pairs of JSON are always of the type
str. When a dictionary is converted into JSON, all the keys of the dictionary are converted to strings. As a result of this, if a dictionary is converted into JSON and then back into a dictionary, the dictionary may not equal the original one. That is,loads(dumps(x)) != xif x has non-string keys. sort_keys sorts the keys before they are converted to strings, so numeric keys are sorted by value, not by their string representation.Changed in version 3.2: Allow strings for indent in addition to integers.
Changed in version 3.4: Use
(',', ': ')as default if indent is notNone.Changed in version 3.6: All optional parameters are now keyword-only.
- json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)¶
Serialize obj to a JSON formatted
strusing this conversion table. The arguments have the same meaning as indump().
- json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)¶
Deserialize fp to a Python object using the JSON-to-Python conversion table.
- Parameters:
fp (file-like object) – A
.read()-supporting text file or binary file containing the JSON document to be deserialized.cls (a
JSONDecodersubclass) – If set, a custom JSON decoder. Additional keyword arguments toload()will be passed to the constructor of cls. IfNone(the default),JSONDecoderis used.object_hook (callable | None) – If set, a function that is called with the result of any JSON object literal decoded (a
dict). The return value of this function will be used instead of thedict. This feature can be used to implement custom decoders, for example JSON-RPC class hinting. DefaultNone.object_pairs_hook (callable | None) – If set, a function that is called with the result of any JSON object literal decoded with an ordered list of pairs. The return value of this function will be used instead of the
dict. This feature can be used to implement custom decoders. If object_hook is also set, object_pairs_hook takes priority. DefaultNone.parse_float (callable | None) – If set, a function that is called with the string of every JSON float to be decoded. If
None(the default), it is equivalent tofloat(num_str). This can be used to parse JSON floats into custom datatypes, for exampledecimal.Decimal.parse_int (callable | None) – If set, a function that is called with the string of every JSON int to be decoded. If
None(the default), it is equivalent toint(num_str). This can be used to parse JSON integers into custom datatypes, for examplefloat.parse_constant (callable | None) – If set, a function that is called with one of the following strings:
'-Infinity','Infinity', or'NaN'. This can be used to raise an exception if invalid JSON numbers are encountered. DefaultNone.
- Raises:
JSONDecodeError – When the data being deserialized is not a valid JSON document.
UnicodeDecodeError – When the data being deserialized does not contain UTF-8, UTF-16 or UTF-32 encoded data.
Changed in version 3.1:
Added the optional object_pairs_hook parameter.
parse_constant doesn’t get called on ‘null’, ‘true’, ‘false’ anymore.
Changed in version 3.6:
All optional parameters are now keyword-only.
fp can now be a binary file. The input encoding should be UTF-8, UTF-16 or UTF-32.
Changed in version 3.11: The default parse_int of
int()now limits the maximum length of the integer string via the interpreter’s integer string conversion length limitation to help avoid denial of service attacks.
- json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)¶
Identical to
load(), but instead of a file-like object, deserialize s (astr,bytesorbytearrayinstance containing a JSON document) to a Python object using this conversion table.Changed in version 3.6: s can now be of type
bytesorbytearray. The input encoding should be UTF-8, UTF-16 or UTF-32.Changed in version 3.9: The keyword argument encoding has been removed.
Encoders and Decoders¶
- class json.JSONDecoder(*, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)¶
Simple JSON decoder.
Performs the following translations in decoding by default:
JSON
Python
object
dict
array
list
string
str
number (int)
int
number (real)
float
true
True
false
False
null
None
It also understands
NaN,Infinity, and-Infinityas their correspondingfloatvalues, which is outside the JSON spec.object_hook is an optional function that will be called with the result of every JSON object decoded and its return value will be used in place of the given