Làm thế nào để bạn phân tích một mảng các đối tượng trong python?

JSON [Ký hiệu đối tượng JavaScript], được chỉ định bởi RFC 7159 [đã lỗi thời RFC 4627] và bởi ECMA-404, là một định dạng trao đổi dữ liệu nhẹ được lấy cảm hứng từ cú pháp ký tự đối tượng JavaScript [mặc dù nó không phải là tập con nghiêm ngặt của JavaScript 1 ]

Cảnh báo

Hãy thận trọng khi phân tích cú pháp dữ liệu JSON từ các nguồn không đáng tin cậy. Chuỗi JSON độc hại có thể khiến bộ giải mã tiêu thụ đáng kể tài nguyên bộ nhớ và CPU. Nên giới hạn kích thước dữ liệu được phân tích cú pháp

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
4 hiển thị một API quen thuộc với người dùng các mô-đun
>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
6 và
>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
7 của thư viện tiêu chuẩn

Mã hóa phân cấp đối tượng Python cơ bản

>>> 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"]'

mã hóa nhỏ gọn

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

in đẹp

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}

Giải mã 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']

Chuyên giải mã đối tượng JSON

>>> 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']

Mở rộng

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

>>> 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 json.JSONEncoder.default[self, 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', ']']

Sử dụng

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
9 từ trình bao để xác thực và in đẹp

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

Xem Giao diện dòng lệnh để biết tài liệu chi tiết.

Ghi chú

JSON là một tập hợp con của YAML 1. 2. JSON được tạo bởi cài đặt mặc định của mô-đun này [cụ thể là giá trị dấu phân cách mặc định] cũng là một tập hợp con của YAML 1. 0 và 1. 1. Do đó, mô-đun này cũng có thể được sử dụng làm bộ nối tiếp YAML

Ghi chú

Theo mặc định, bộ mã hóa và giải mã của mô-đun này duy trì thứ tự đầu vào và đầu ra. Đơn hàng chỉ bị mất nếu các thùng chứa bên dưới không có thứ tự

Cách sử dụng cơ bản¶

json. kết xuất[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]

Sắp xếp thứ tự obj dưới dạng luồng có định dạng JSON thành fp [một đối tượng dạng tệphỗ trợ

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
hỗ trợ
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
0
] bằng cách sử dụng conversion table.

Nếu phím bỏ qua là đúng [mặc định.

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
1], sau đó các phím chính tả không thuộc loại cơ bản [
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
2,
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
3,
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
4,
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
5,
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
6] sẽ bị bỏ qua thay vì tăng
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
7

Mô-đun

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
4 luôn tạo ra các đối tượng
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
2, không phải đối tượng
>>> 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']
0. Do đó,
>>> 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']
1 phải hỗ trợ đầu vào
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
2

Nếu ensure_ascii là đúng [mặc định], đầu ra được đảm bảo có tất cả các ký tự không phải ASCII được thoát. Nếu ensure_ascii là sai, các ký tự này sẽ được xuất nguyên trạng

Nếu check_circular là false [mặc định.

>>> 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']
3], thì việc kiểm tra tham chiếu vòng đối với các loại vùng chứa sẽ bị bỏ qua và tham chiếu vòng sẽ dẫn đến kết quả là
>>> 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']
4 [hoặc tệ hơn]

Nếu allow_nan là false [mặc định.

>>> 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']
3], thì nó sẽ là một
>>> 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']
6 để tuần tự hóa các giá trị ngoài phạm vi
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
4 [
>>> 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']
8,
>>> 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']
9,
>>> 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']
0] tuân thủ nghiêm ngặt đặc tả JSON. Nếu allow_nan là true, JavaScript tương đương của chúng [
>>> 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']
1,
>>> 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']
2,
>>> 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']
3] sẽ được sử dụng

Nếu thụt lề là một số nguyên hoặc chuỗi không âm, thì các phần tử mảng JSON và các thành viên đối tượng sẽ được in đẹp với mức thụt lề đó. Mức thụt lề bằng 0, âm hoặc

>>> 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']
4 sẽ chỉ chèn các dòng mới.
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
6 [mặc định] chọn biểu diễn nhỏ gọn nhất. Sử dụng một số nguyên dương thụt lề nhiều khoảng trắng trên mỗi cấp. Nếu thụt lề là một chuỗi [chẳng hạn như
>>> 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']
6], thì chuỗi đó được dùng để thụt lề mỗi cấp

Đã thay đổi trong phiên bản 3. 2. Cho phép chuỗi thụt lề ngoài số nguyên.

Nếu được chỉ định, các dấu phân cách phải là một bộ dữ liệu

>>> 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']
7. Giá trị mặc định là
>>> 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']
8 nếu thụt lề là
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
6 và ngược lại là
>>> 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 json.JSONEncoder.default[self, 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', ']']
0. Để có được biểu diễn JSON nhỏ gọn nhất, bạn nên chỉ định
>>> 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 json.JSONEncoder.default[self, 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', ']']
1 để loại bỏ khoảng trắng

Đã thay đổi trong phiên bản 3. 4. Sử dụng

>>> 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 json.JSONEncoder.default[self, 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', ']']
0 làm mặc định nếu thụt lề không phải là
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
6.

Nếu được chỉ định, mặc định phải là một hàm được gọi cho các đối tượng không thể được tuần tự hóa. Nó sẽ trả về một phiên bản có thể mã hóa JSON của đối tượng hoặc tăng

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
7. Nếu không được chỉ định,
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
7 được nâng lên

Nếu sort_keys là true [mặc định.

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
1], thì đầu ra của từ điển sẽ được sắp xếp theo khóa

Để sử dụng một lớp con

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
8 tùy chỉnh [e. g. một ghi đè phương thức
>>> 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 json.JSONEncoder.default[self, 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', ']']
8 để sắp xếp theo thứ tự các loại bổ sung], chỉ định nó bằng cls kwarg;

Đã thay đổi trong phiên bản 3. 6. Tất cả các tham số tùy chọn giờ đây chỉ từ khóa .

Ghi chú

Không giống như

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
7 và
>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
6, JSON không phải là một giao thức được đóng khung, do đó, việc cố gắng tuần tự hóa nhiều đối tượng bằng các lệnh gọi lặp lại tới
>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
12 bằng cùng một fp sẽ dẫn đến một tệp JSON không hợp lệ

json. kết xuất[obj , *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw]

Sắp xếp thứ tự obj thành định dạng JSON

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
2 bằng cách sử dụng bảng chuyển đổi này. Các đối số có cùng ý nghĩa như trong
>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
12.

Ghi chú

Các khóa trong cặp khóa/giá trị của JSON luôn thuộc loại

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
2. Khi một từ điển được chuyển đổi thành JSON, tất cả các khóa của từ điển sẽ bị ép thành chuỗi. Do đó, nếu một từ điển được chuyển đổi thành JSON và sau đó trở lại thành một từ điển, thì từ điển đó có thể không giống với từ điển gốc. Đó là,
>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
16 nếu x có khóa không phải chuỗi

json. tải[fp , *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw]

Giải tuần tự hóa fp [một tệp văn bản hỗ trợ

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
17 hoặc hoặc hoặc hoặc hoặc hoặc hoặc hoặc hoặc hoặc hoặc hoặc hoặc hoặc hoặc hoặc hoặc hoặc hoặc hoặc hoặc tệp nhị phân containing a JSON document] to a Python object using this conversion table.

object_hook là một chức năng tùy chọn sẽ được gọi với kết quả của bất kỳ đối tượng nào được giải mã theo nghĩa đen [a

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
18]. Giá trị trả về của object_hook sẽ được sử dụng thay cho
>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
18. Tính năng này có thể được sử dụng để triển khai bộ giải mã tùy chỉnh [e. g. gợi ý lớp JSON-RPC]

object_pairs_hook là một hàm tùy chọn sẽ được gọi với kết quả của bất kỳ đối tượng nào được giải mã bằng một danh sách các cặp được sắp xếp theo thứ tự. Giá trị trả về của object_pairs_hook sẽ được sử dụng thay vì

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
18. Tính năng này có thể được sử dụng để triển khai bộ giải mã tùy chỉnh. Nếu object_hook cũng được xác định, thì object_pairs_hook sẽ được ưu tiên

Đã thay đổi trong phiên bản 3. 1. Đã thêm hỗ trợ cho object_pairs_hook.

parse_float, nếu được chỉ định, sẽ được gọi với chuỗi của mọi float JSON được giải mã. Theo mặc định, điều này tương đương với

>>> 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']
31. Điều này có thể được sử dụng để sử dụng một kiểu dữ liệu hoặc trình phân tích cú pháp khác cho các float JSON [e. g.
>>> 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']
32]

parse_int, nếu được chỉ định, sẽ được gọi với chuỗi của mọi JSON int sẽ được giải mã. Theo mặc định, điều này tương đương với

>>> 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']
33. Điều này có thể được sử dụng để sử dụng một kiểu dữ liệu hoặc trình phân tích cú pháp khác cho các số nguyên JSON [e. g.
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
4]

Đã thay đổi trong phiên bản 3. 11. Pars_int mặc định của

>>> 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']
35 hiện giới hạn độ dài tối đa của chuỗi số nguyên thông qua giới hạn độ dài chuyển đổi chuỗi số nguyên của trình thông dịch thành .

parse_constant, nếu được chỉ định, sẽ được gọi bằng một trong các chuỗi sau. ________ 636, ________ 637, ________ 638. Điều này có thể được sử dụng để đưa ra một ngoại lệ nếu gặp phải số JSON không hợp lệ

Đã thay đổi trong phiên bản 3. 1. parse_constant không còn được gọi trên 'null', 'true', 'false' nữa.

Để sử dụng một lớp con

>>> 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']
39 tùy chỉnh, hãy chỉ định lớp con đó bằng
>>> 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']
20 kwarg; . Các đối số từ khóa bổ sung sẽ được chuyển đến hàm tạo của lớp

Nếu dữ liệu được deserialized không phải là một tài liệu JSON hợp lệ, một

>>> 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']
22 sẽ được nâng lên

Đã thay đổi trong phiên bản 3. 6. Tất cả các tham số tùy chọn giờ đây chỉ từ khóa .

Đã thay đổi trong phiên bản 3. 6. fp hiện có thể là tệp nhị phân . Mã hóa đầu vào phải là UTF-8, UTF-16 hoặc UTF-32.

json. tải[s , *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw]

Deserialize s [một phiên bản

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
2,
>>> 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']
0 hoặc
>>> 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']
25 chứa tài liệu JSON] thành một đối tượng Python bằng cách sử dụng bảng chuyển đổi này.

Các đối số khác có cùng ý nghĩa như trong

>>> 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']
26

Nếu dữ liệu được deserialized không phải là một tài liệu JSON hợp lệ, một

>>> 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']
22 sẽ được nâng lên

Đã thay đổi trong phiên bản 3. 6. s hiện có thể thuộc loại

>>> 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']
0 hoặc
>>> 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']
25. Mã hóa đầu vào phải là UTF-8, UTF-16 hoặc UTF-32.

Đã thay đổi trong phiên bản 3. 9. Mã hóa đối số từ khóa đã bị xóa.

Bộ mã hóa và giải mã¶

lớp json. JSONDecoder[* , object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None]

Bộ giải mã JSON đơn giản

Thực hiện các bản dịch sau trong giải mã theo mặc định

JSON

con trăn

sự vật

mệnh lệnh

mảng

danh sách

sợi dây

str

số [int]

int

số [thực]

trôi nổi

thật

ĐÚNG VẬY

sai

Sai

vô giá trị

Không có

Nó cũng hiểu

>>> 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']
1,
>>> 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']
2 và
>>> 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']
3 là các giá trị
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
4 tương ứng của chúng, nằm ngoài thông số kỹ thuật JSON

object_hook, nếu được chỉ định, sẽ được gọi với kết quả của mọi đối tượng JSON được giải mã và giá trị trả về của nó sẽ được sử dụng thay cho

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
18 đã cho. Điều này có thể được sử dụng để cung cấp giải tuần tự hóa tùy chỉnh [e. g. để hỗ trợ gợi ý lớp JSON-RPC]

object_pairs_hook, nếu được chỉ định sẽ được gọi với kết quả của mọi đối tượng JSON được giải mã bằng danh sách các cặp được sắp xếp theo thứ tự. Giá trị trả về của object_pairs_hook sẽ được sử dụng thay vì

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
18. Tính năng này có thể được sử dụng để triển khai bộ giải mã tùy chỉnh. Nếu object_hook cũng được xác định, thì object_pairs_hook sẽ được ưu tiên

Đã thay đổi trong phiên bản 3. 1. Đã thêm hỗ trợ cho object_pairs_hook.

parse_float, nếu được chỉ định, sẽ được gọi với chuỗi của mọi float JSON được giải mã. Theo mặc định, điều này tương đương với

>>> 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']
31. Điều này có thể được sử dụng để sử dụng một kiểu dữ liệu hoặc trình phân tích cú pháp khác cho các float JSON [e. g.
>>> 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']
32]

parse_int, nếu được chỉ định, sẽ được gọi với chuỗi của mọi JSON int sẽ được giải mã. Theo mặc định, điều này tương đương với

>>> 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']
33. Điều này có thể được sử dụng để sử dụng một kiểu dữ liệu hoặc trình phân tích cú pháp khác cho các số nguyên JSON [e. g.
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
4]

parse_constant, nếu được chỉ định, sẽ được gọi bằng một trong các chuỗi sau. ________ 636, ________ 637, ________ 638. Điều này có thể được sử dụng để đưa ra một ngoại lệ nếu gặp phải số JSON không hợp lệ

Nếu nghiêm ngặt là sai [_______63 là mặc định], thì các ký tự điều khiển sẽ được phép bên trong chuỗi. Các ký tự điều khiển trong ngữ cảnh này là những ký tự có mã ký tự trong phạm vi 0–31, bao gồm

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
04 [tab],
>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
05,
>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
06 và
>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
07

Nếu dữ liệu được deserialized không phải là một tài liệu JSON hợp lệ, một

>>> 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']
22 sẽ được nâng lên

Đã thay đổi trong phiên bản 3. 6. Tất cả các tham số hiện tại chỉ từ khóa .

giải mã[s]

Trả về biểu diễn Python của s [một phiên bản

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
2 chứa tài liệu JSON]

>>> 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']
22 sẽ được nâng lên nếu tài liệu JSON đã cho không hợp lệ

raw_decode[s]

Giải mã một tài liệu JSON từ s [một

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
2 bắt đầu bằng một tài liệu JSON] và trả về 2-tuple của biểu diễn Python và chỉ mục trong s nơi tài liệu kết thúc

Điều này có thể được sử dụng để giải mã tài liệu JSON từ một chuỗi có thể có dữ liệu không liên quan ở cuối

lớp json. Bộ mã hóa JSON[* , bỏ qua phím=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None]

Bộ mã hóa JSON có thể mở rộng cho cấu trúc dữ liệu Python

Hỗ trợ các đối tượng và loại sau theo mặc định

con trăn

JSON

mệnh lệnh

sự vật

danh sách, bộ

mảng

str

sợi dây

int, float, int- & float có nguồn gốc từ Enums

con số

ĐÚNG VẬY

thật

Sai

sai

Không có

vô giá trị

Đã thay đổi trong phiên bản 3. 4. Đã thêm hỗ trợ cho các lớp Enum có nguồn gốc int và float.

Để mở rộng điều này để nhận ra các đối tượng khác, hãy phân lớp và triển khai phương thức

>>> 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 json.JSONEncoder.default[self, 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', ']']
8 với một phương thức khác trả về một đối tượng có thể tuần tự hóa cho
>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
13 nếu có thể, nếu không, nó nên gọi triển khai siêu lớp [để nâng cao
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
7]

Nếu phím bỏ qua là sai [mặc định], một số

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
7 sẽ xuất hiện khi cố mã hóa các khóa không phải là
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
2,
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
3,
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
4 hoặc
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
6. Nếu phím bỏ qua là đúng, các mục đó chỉ bị bỏ qua

Nếu ensure_ascii là đúng [mặc định], đầu ra được đảm bảo có tất cả các ký tự không phải ASCII được thoát. Nếu ensure_ascii là sai, các ký tự này sẽ được xuất nguyên trạng

Nếu check_circular là true [mặc định], thì các danh sách, ký tự và các đối tượng được mã hóa tùy chỉnh sẽ được kiểm tra các tham chiếu vòng tròn trong quá trình mã hóa để ngăn chặn đệ quy vô hạn [điều này sẽ gây ra lỗi

>>> 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']
4]. Mặt khác, không có kiểm tra như vậy diễn ra

Nếu allow_nan là true [mặc định], thì

>>> 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']
1,
>>> 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']
2 và
>>> 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']
3 sẽ được mã hóa như vậy. Hành vi này không tuân thủ đặc tả JSON, nhưng phù hợp với hầu hết các bộ mã hóa và giải mã dựa trên JavaScript. Nếu không, nó sẽ là một
>>> 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']
6 để mã hóa các số float đó

Nếu sort_keys là true [mặc định.

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
1], thì đầu ra của từ điển sẽ được sắp xếp theo khóa;

Nếu thụt lề là một số nguyên hoặc chuỗi không âm, thì các phần tử mảng JSON và các thành viên đối tượng sẽ được in đẹp với mức thụt lề đó. Mức thụt lề bằng 0, âm hoặc

>>> 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']
4 sẽ chỉ chèn các dòng mới.
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
6 [mặc định] chọn biểu diễn nhỏ gọn nhất. Sử dụng một số nguyên dương thụt lề nhiều khoảng trắng trên mỗi cấp. Nếu thụt lề là một chuỗi [chẳng hạn như
>>> 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']
6], thì chuỗi đó được dùng để thụt lề mỗi cấp

Đã thay đổi trong phiên bản 3. 2. Cho phép chuỗi thụt lề ngoài số nguyên.

Nếu được chỉ định, các dấu phân cách phải là một bộ dữ liệu

>>> 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']
7. Giá trị mặc định là
>>> 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']
8 nếu thụt lề là
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
6 và ngược lại là
>>> 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 json.JSONEncoder.default[self, 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', ']']
0. Để có được biểu diễn JSON nhỏ gọn nhất, bạn nên chỉ định
>>> 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 json.JSONEncoder.default[self, 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', ']']
1 để loại bỏ khoảng trắng

Đã thay đổi trong phiên bản 3. 4. Sử dụng

>>> 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 json.JSONEncoder.default[self, 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', ']']
0 làm mặc định nếu thụt lề không phải là
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
6.

Nếu được chỉ định, mặc định phải là một hàm được gọi cho các đối tượng không thể được tuần tự hóa. Nó sẽ trả về một phiên bản có thể mã hóa JSON của đối tượng hoặc tăng

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
7. Nếu không được chỉ định,
>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
7 được nâng lên

Đã thay đổi trong phiên bản 3. 6. Tất cả các tham số hiện tại chỉ từ khóa .

mặc định[o]

Triển khai phương thức này trong một lớp con sao cho nó trả về một đối tượng có thể tuần tự hóa cho o hoặc gọi triển khai cơ sở [để nâng cao một

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
7]

Ví dụ: để hỗ trợ các trình vòng lặp tùy ý, bạn có thể triển khai

>>> 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 json.JSONEncoder.default[self, 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', ']']
8 như thế này

>>> 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']
3

mã hóa[o]

Trả về biểu diễn chuỗi JSON của cấu trúc dữ liệu Python, o. Ví dụ

>>> 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']
2

iterencode[o]

Mã hóa đối tượng đã cho, o và tạo ra từng biểu diễn chuỗi nếu có. Ví dụ

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

Ngoại lệ¶

ngoại lệ json. JSONDecodeError[tin nhắn , doc, pos]

Phân lớp của

>>> 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']
6 với các thuộc tính bổ sung sau

tin nhắn

Thông báo lỗi không được định dạng

doc

Tài liệu JSON đang được phân tích cú pháp

tư thế

Chỉ mục bắt đầu của tài liệu nơi phân tích cú pháp không thành công

lineno

Dòng tương ứng với vị trí

colno

Cột tương ứng với vị trí

Mới trong phiên bản 3. 5

Tuân thủ tiêu chuẩn và khả năng tương tác¶

Định dạng JSON được chỉ định bởi RFC 7159 và ECMA-404. Phần này nêu chi tiết mức độ tuân thủ của mô-đun này với RFC. Để đơn giản, các lớp con

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
8 và
>>> 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']
39 và các tham số khác với các tham số được đề cập rõ ràng, không được xem xét

Mô-đun này không tuân thủ nghiêm ngặt RFC, triển khai một số tiện ích mở rộng là JavaScript hợp lệ nhưng JSON không hợp lệ. Đặc biệt

  • Các giá trị số vô hạn và NaN được chấp nhận và xuất ra;

  • Tên lặp lại trong một đối tượng được chấp nhận và chỉ giá trị của cặp giá trị tên cuối cùng được sử dụng

Vì RFC cho phép các trình phân tích cú pháp tuân thủ RFC chấp nhận các văn bản đầu vào không tuân thủ RFC, nên trình giải tuần tự của mô-đun này tuân thủ RFC về mặt kỹ thuật trong cài đặt mặc định

Mã hóa ký tự¶

RFC yêu cầu JSON được biểu diễn bằng UTF-8, UTF-16 hoặc UTF-32, với UTF-8 là mặc định được đề xuất để có khả năng tương tác tối đa

Khi được RFC cho phép, mặc dù không bắt buộc, bộ nối tiếp của mô-đun này đặt ensure_ascii=True theo mặc định, do đó thoát khỏi đầu ra để các chuỗi kết quả chỉ chứa các ký tự ASCII

Khác với tham số ensure_ascii, mô-đun này được xác định nghiêm ngặt về mặt chuyển đổi giữa các đối tượng Python và

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
43, và do đó không giải quyết trực tiếp vấn đề mã hóa ký tự

RFC cấm thêm dấu thứ tự byte [BOM] vào đầu văn bản JSON và trình tuần tự hóa của mô-đun này không thêm BOM vào đầu ra của nó. RFC cho phép, nhưng không yêu cầu, trình giải tuần tự JSON bỏ qua BOM ban đầu trong đầu vào của chúng. Trình giải tuần tự của mô-đun này tăng

>>> 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']
6 khi có BOM ban đầu

RFC không cấm một cách rõ ràng các chuỗi JSON chứa các chuỗi byte không tương ứng với các ký tự Unicode hợp lệ [e. g. thay thế UTF-16 chưa ghép nối], nhưng có lưu ý rằng chúng có thể gây ra các vấn đề về khả năng tương tác. Theo mặc định, mô-đun này chấp nhận và xuất các điểm mã [khi có trong bản gốc

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
2] cho các chuỗi đó

Giá trị số vô hạn và NaN¶

RFC không cho phép biểu diễn các giá trị số vô hạn hoặc số NaN. Mặc dù vậy, theo mặc định, mô-đun này chấp nhận và xuất ra

>>> 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']
2,
>>> 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']
3 và
>>> 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']
1 như thể chúng là các giá trị chữ số JSON hợp lệ

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

Trong serializer, tham số allow_nan có thể được sử dụng để thay đổi hành vi này. Trong trình giải nén, tham số parse_constant có thể được sử dụng để thay đổi hành vi này

Tên lặp lại trong một đối tượng¶

RFC chỉ định rằng các tên trong một đối tượng JSON phải là duy nhất, nhưng không bắt buộc phải xử lý các tên lặp lại trong các đối tượng JSON như thế nào. Theo mặc định, mô-đun này không đưa ra ngoại lệ;

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

Tham số object_pairs_hook có thể được sử dụng để thay đổi hành vi này

Giá trị không phải đối tượng, không phải mảng cấp cao nhất¶

Phiên bản cũ của JSON được chỉ định bởi RFC 4627 đã lỗi thời yêu cầu giá trị cấp cao nhất của văn bản JSON phải là một đối tượng hoặc mảng JSON [Python

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
18 hoặc
>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
50] và không thể là JSON null, boolean, số hoặc . RFC 7159 đã loại bỏ hạn chế đó và mô-đun này không và chưa bao giờ triển khai hạn chế đó trong bộ tuần tự hóa hoặc bộ giải tuần tự của nó

Bất kể, để có khả năng tương tác tối đa, bạn có thể muốn tự nguyện tuân thủ các hạn chế

Giới hạn triển khai¶

Một số triển khai trình giải nén JSON có thể đặt giới hạn cho

  • kích thước của văn bản JSON được chấp nhận

  • mức độ lồng nhau tối đa của các đối tượng và mảng JSON

  • phạm vi và độ chính xác của các số JSON

  • nội dung và độ dài tối đa của chuỗi JSON

Mô-đun này không áp đặt bất kỳ giới hạn nào ngoài giới hạn của chính các kiểu dữ liệu Python có liên quan hoặc của chính trình thông dịch Python

Khi tuần tự hóa thành JSON, hãy cẩn thận với bất kỳ giới hạn nào như vậy trong các ứng dụng có thể sử dụng JSON của bạn. Cụ thể, thông thường các số JSON được giải tuần tự hóa thành các số có độ chính xác kép IEEE 754 và do đó phải tuân theo các giới hạn về phạm vi và độ chính xác của biểu diễn đó. Điều này đặc biệt có liên quan khi tuần tự hóa các giá trị Python

>>> import json
>>> print[json.dumps[{'4': 5, '6': 7}, sort_keys=True, indent=4]]
{
    "4": 5,
    "6": 7
}
3 có độ lớn cực lớn hoặc khi tuần tự hóa các thể hiện của các loại số "lạ" như
>>> 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']
32

Giao diện dòng lệnh¶

Mã nguồn. Lib/json/công cụ. py

Mô-đun

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
9 cung cấp giao diện dòng lệnh đơn giản để xác thực và in đẹp các đối tượng JSON

Nếu các đối số tùy chọn

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
54 và
>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
55 không được chỉ định, thì
>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
56 và
>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
57 sẽ được sử dụng tương ứng

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

Đã thay đổi trong phiên bản 3. 5. Đầu ra hiện có cùng thứ tự với đầu vào. Sử dụng tùy chọn

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
58 để sắp xếp đầu ra của từ điển theo thứ tự bảng chữ cái theo khóa.

Tùy chọn dòng lệnh¶

infile

Tệp JSON được xác thực hoặc được in đẹp

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

Nếu infile không được chỉ định, đọc từ

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

tệp ngoài

Viết đầu ra của infile vào outfile đã cho. Nếu không, hãy viết nó cho

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

--phím sắp xếp

Sắp xếp đầu ra của từ điển theo thứ tự bảng chữ cái theo khóa

Mới trong phiên bản 3. 5

--no-ensure-ascii

Tắt thoát các ký tự không phải mã ascii, xem

>>> import json
>>> json.dumps[[1, 2, 3, {'4': 5, '6': 7}], separators=[',', ':']]
'[1,2,3,{"4":5,"6":7}]'
61 để biết thêm thông tin

Mới trong phiên bản 3. 9

--json-lines

Phân tích mọi dòng đầu vào thành đối tượng JSON riêng biệt

Mới trong phiên bản 3. 8

--thụt lề, --tab, -, --compact

Các tùy chọn loại trừ lẫn nhau để kiểm soát khoảng trắng

Mới trong phiên bản 3. 9

-h, --trợ giúp

Hiển thị thông báo trợ giúp

chú thích

1

Như đã lưu ý trong lỗi in cho RFC 7159, JSON cho phép các ký tự chữ U+2028 [LINE SEPARATOR] và U+2029 [PARAGRAPH SEPARATOR] trong chuỗi, trong khi JavaScript [kể từ Phiên bản ECMAScript 5. 1] không

Chủ Đề