Objek respons python ke dict

JSON (JavaScript Object Notation), ditentukan oleh RFC 7159 (yang menggantikan RFC 4627) dan oleh ECMA-404, adalah format pertukaran data ringan yang terinspirasi oleh sintaks literal objek JavaScript (walaupun ini bukan bagian yang ketat dari JavaScript )

Peringatan

Berhati-hatilah saat mem-parsing data JSON dari sumber yang tidak tepercaya. String JSON yang berbahaya dapat menyebabkan dekoder menghabiskan banyak sumber daya CPU dan memori. Membatasi ukuran data yang akan diuraikan dianjurkan

memaparkan API yang familier bagi pengguna pustaka dan modul standar

Mengkodekan hierarki objek Python dasar

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

Pengodean ringkas

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

Percetakan cantik

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

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

Mengkhususkan decoding objek 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')
_

Memperpanjang

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

Menggunakan dari shell untuk memvalidasi dan mencetak cantik

$ echo '{"json":"obj"}' | python -m json.tool
{
    "json": "obj"
}
$ echo '{1.2:3.4}' | python -m json.tool
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
_

Lihat untuk dokumentasi terperinci

Catatan

JSON adalah bagian dari YAML 1. 2. JSON yang dihasilkan oleh pengaturan default modul ini (khususnya, nilai pemisah default) juga merupakan subset dari YAML 1. 0 dan 1. 1. Modul ini juga dapat digunakan sebagai serializer YAML

Catatan

Encoder dan decoder modul ini mempertahankan urutan input dan output secara default. Pesanan hanya hilang jika wadah yang mendasarinya tidak diurutkan

Penggunaan Dasar

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)

Serialisasi obj sebagai aliran berformat JSON ke fp (mendukung

>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
    "4": 5,
    "6": 7
}
0) menggunakan ini

Jika skipkeys benar (default.

>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
    "4": 5,
    "6": 7
}
1), maka kunci dict yang bukan tipe dasar (, , , ,
>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
    "4": 5,
    "6": 7
}
6) akan dilewati alih-alih menaikkan a

Modul selalu menghasilkan objek, bukan objek. Oleh karena itu,

>>> 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 harus mendukung masukan

Jika sure_ascii benar (default), keluaran dijamin akan membuat semua karakter non-ASCII yang masuk lolos. Jika sure_ascii salah, karakter ini akan ditampilkan apa adanya

Jika check_circular salah (default.

>>> 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), maka pemeriksaan referensi melingkar untuk jenis wadah akan dilewati dan referensi melingkar akan menghasilkan (atau lebih buruk)

Jika allow_nan salah (default.

>>> 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), maka itu akan menjadi serialisasi di luar nilai rentang (
>>> 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) sesuai ketat dengan spesifikasi JSON. Jika allow_nan benar, padanan JavaScriptnya (
>>> 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) akan digunakan

Jika indent adalah bilangan bulat atau string non-negatif, maka elemen array JSON dan anggota objek akan dicetak cantik dengan tingkat indentasi tersebut. Tingkat indentasi 0, negatif, atau

>>> 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 hanya akan menyisipkan baris baru.
>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
    "4": 5,
    "6": 7
}
6 (default) memilih representasi yang paling ringkas. Menggunakan indentasi bilangan bulat positif yang banyak ruang per tingkat. Jika indentasi berupa string (seperti
>>> 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), string tersebut digunakan untuk mengindentasi setiap level

Berubah di versi 3. 2. Izinkan string untuk indentasi selain bilangan bulat.

Jika ditentukan, pemisah harus berupa tuple ________4______7. Standarnya adalah

>>> 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 jika inden adalah
>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
    "4": 5,
    "6": 7
}
6 dan
>>> 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 sebaliknya. Untuk mendapatkan representasi JSON yang paling ringkas, Anda harus menentukan
>>> 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 untuk menghilangkan spasi

Berubah di versi 3. 4. Gunakan

>>> 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 sebagai default jika indent bukan
>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
    "4": 5,
    "6": 7
}
6.

Jika ditentukan, default harus berupa fungsi yang dipanggil untuk objek yang tidak dapat diserialisasi. Itu harus mengembalikan versi objek yang dapat dikodekan JSON atau menaikkan a. Jika tidak ditentukan, dinaikkan

Jika sort_keys benar (default.

>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
    "4": 5,
    "6": 7
}
1), maka keluaran kamus akan diurutkan berdasarkan kunci

Untuk menggunakan subkelas khusus (mis. g. salah satu yang menggantikan metode

>>> 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 untuk membuat cerita bersambung jenis tambahan), tentukan dengan cls kwarg;

Berubah di versi 3. 6. Semua parameter opsional sekarang.

Catatan

Tidak seperti and , JSON bukan protokol berbingkai, jadi mencoba membuat serial beberapa objek dengan panggilan berulang menggunakan fp yang sama akan menghasilkan file JSON yang tidak valid

json. pembuangan(obj , *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

Serialkan obj ke JSON yang diformat menggunakan ini. Argumen memiliki arti yang sama seperti di

Catatan

Kunci dalam pasangan kunci/nilai JSON selalu bertipe. Saat kamus diubah menjadi JSON, semua kunci kamus dipaksa menjadi string. Akibatnya, jika kamus diubah menjadi JSON dan kemudian kembali menjadi kamus, kamus tersebut mungkin tidak sama dengan yang asli. Artinya,

$ echo '{"json":"obj"}' | python -m json.tool
{
    "json": "obj"
}
$ echo '{1.2:3.4}' | python -m json.tool
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
6 jika x memiliki kunci non-string

json. memuat(fp , *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

Deserialize fp (a

$ echo '{"json":"obj"}' | python -m json.tool
{
    "json": "obj"
}
$ echo '{1.2:3.4}' | python -m json.tool
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
_7-mendukung atau berisi dokumen JSON) ke objek Python menggunakan ini

object_hook adalah fungsi opsional yang akan dipanggil dengan hasil dari dekode literal objek apa pun (a ). Nilai pengembalian object_hook akan digunakan sebagai pengganti. Fitur ini dapat digunakan untuk mengimplementasikan dekoder khusus (mis. g. Petunjuk kelas JSON-RPC)

object_pairs_hook adalah fungsi opsional yang akan dipanggil dengan hasil dari setiap literal objek yang didekodekan dengan daftar pasangan yang diurutkan. Nilai pengembalian object_pairs_hook akan digunakan sebagai pengganti. Fitur ini dapat digunakan untuk mengimplementasikan decoder kustom. Jika object_hook juga ditentukan, object_pairs_hook diprioritaskan

Berubah di versi 3. 1. Menambahkan dukungan untuk object_pairs_hook.

parse_float, jika ditentukan, akan dipanggil dengan string dari setiap float JSON yang akan didekodekan. Secara default, ini setara dengan

def default(self, o):
   try:
       iterable = iter(o)
   except TypeError:
       pass
   else:
       return list(iterable)
   # Let the base class default method raise the TypeError
   return json.JSONEncoder.default(self, o)
1. Ini dapat digunakan untuk menggunakan tipe data atau parser lain untuk float JSON (mis. g. )

parse_int, jika ditentukan, akan dipanggil dengan string dari setiap int JSON yang akan didekodekan. Secara default, ini setara dengan

def default(self, o):
   try:
       iterable = iter(o)
   except TypeError:
       pass
   else:
       return list(iterable)
   # Let the base class default method raise the TypeError
   return json.JSONEncoder.default(self, o)
3. Ini dapat digunakan untuk menggunakan tipe data atau parser lain untuk bilangan bulat JSON (mis. g. )

Berubah di versi 3. 11. Parse_int default sekarang membatasi panjang maksimum string bilangan bulat melalui juru bahasa untuk membantu menghindari penolakan serangan layanan.

parse_constant, jika ditentukan, akan dipanggil dengan salah satu string berikut.

def default(self, o):
   try:
       iterable = iter(o)
   except TypeError:
       pass
   else:
       return list(iterable)
   # Let the base class default method raise the TypeError
   return json.JSONEncoder.default(self, o)
6,
def default(self, o):
   try:
       iterable = iter(o)
   except TypeError:
       pass
   else:
       return list(iterable)
   # Let the base class default method raise the TypeError
   return json.JSONEncoder.default(self, o)
7,
def default(self, o):
   try:
       iterable = iter(o)
   except TypeError:
       pass
   else:
       return list(iterable)
   # Let the base class default method raise the TypeError
   return json.JSONEncoder.default(self, o)
8. Ini dapat digunakan untuk memunculkan pengecualian jika nomor JSON yang tidak valid ditemukan

Berubah di versi 3. 1. parse_constant tidak lagi dipanggil pada 'null', 'true', 'false'.

Untuk menggunakan subkelas khusus, tentukan dengan

>>> json.JSONEncoder().encode({"foo": ["bar", "baz"]})
'{"foo": ["bar", "baz"]}'
0 kwarg; . Argumen kata kunci tambahan akan diteruskan ke konstruktor kelas

Jika data yang dideserialisasi bukan dokumen JSON yang valid, a akan dimunculkan

Berubah di versi 3. 6. Semua parameter opsional sekarang.

Berubah di versi 3. 6. fp sekarang bisa menjadi a. Pengkodean masukan harus UTF-8, UTF-16 atau UTF-32.

json. memuat(s , *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

Deserialisasi s (a , atau instance yang berisi dokumen JSON) ke objek Python menggunakan ini

Argumen lain memiliki arti yang sama seperti di

Jika data yang dideserialisasi bukan dokumen JSON yang valid, a akan dimunculkan

Berubah di versi 3. 6. s sekarang bisa bertipe or. Pengkodean masukan harus UTF-8, UTF-16 atau UTF-32.

Berubah di versi 3. 9. Encoding argumen kata kunci telah dihapus.

Encoder dan Decoder

kelas json. JSONDecoder(* , object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)

Dekoder JSON sederhana

Melakukan terjemahan berikut dalam decoding secara default

JSON

Piton

obyek

dikt

Himpunan

daftar

rangkaian

str

nomor (int)

int

nomor (nyata)

mengambang

BENAR

BENAR

Salah

PALSU

batal

Tidak ada

Itu juga memahami

>>> 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, dan
>>> 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 sebagai nilai
>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
    "4": 5,
    "6": 7
}
4 yang sesuai, yang berada di luar spesifikasi JSON

object_hook, jika ditentukan, akan dipanggil dengan hasil dari setiap objek JSON yang didekodekan dan nilai pengembaliannya akan digunakan sebagai pengganti yang diberikan. Ini dapat digunakan untuk menyediakan deserialisasi khusus (mis. g. untuk mendukung petunjuk kelas JSON-RPC)

object_pairs_hook, jika ditentukan akan dipanggil dengan hasil dari setiap objek JSON yang didekodekan dengan daftar pasangan yang diurutkan. Nilai pengembalian object_pairs_hook akan digunakan sebagai pengganti. Fitur ini dapat digunakan untuk mengimplementasikan decoder kustom. Jika object_hook juga ditentukan, object_pairs_hook diprioritaskan

Berubah di versi 3. 1. Menambahkan dukungan untuk object_pairs_hook.

parse_float, jika ditentukan, akan dipanggil dengan string dari setiap float JSON yang akan didekodekan. Secara default, ini setara dengan

def default(self, o):
   try:
       iterable = iter(o)
   except TypeError:
       pass
   else:
       return list(iterable)
   # Let the base class default method raise the TypeError
   return json.JSONEncoder.default(self, o)
1. Ini dapat digunakan untuk menggunakan tipe data atau parser lain untuk float JSON (mis. g. )

parse_int, jika ditentukan, akan dipanggil dengan string dari setiap int JSON yang akan didekodekan. Secara default, ini setara dengan

def default(self, o):
   try:
       iterable = iter(o)
   except TypeError:
       pass
   else:
       return list(iterable)
   # Let the base class default method raise the TypeError
   return json.JSONEncoder.default(self, o)
3. Ini dapat digunakan untuk menggunakan tipe data atau parser lain untuk bilangan bulat JSON (mis. g. )

parse_constant, jika ditentukan, akan dipanggil dengan salah satu string berikut.

def default(self, o):
   try:
       iterable = iter(o)
   except TypeError:
       pass
   else:
       return list(iterable)
   # Let the base class default method raise the TypeError
   return json.JSONEncoder.default(self, o)
6,
def default(self, o):
   try:
       iterable = iter(o)
   except TypeError:
       pass
   else:
       return list(iterable)
   # Let the base class default method raise the TypeError
   return json.JSONEncoder.default(self, o)
7,
def default(self, o):
   try:
       iterable = iter(o)
   except TypeError:
       pass
   else:
       return list(iterable)
   # Let the base class default method raise the TypeError
   return json.JSONEncoder.default(self, o)
8. Ini dapat digunakan untuk memunculkan pengecualian jika nomor JSON yang tidak valid ditemukan

Jika ketat salah (

>>> 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 adalah default), maka karakter kontrol akan diizinkan di dalam string. Karakter kontrol dalam konteks ini adalah karakter dengan kode karakter dalam rentang 0–31, termasuk
>>> 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, dan
>>> import json
>>> json.dumps([1, 2, 3, {'4': 5, '6': 7}], separators=(',', ':'))
'[1,2,3,{"4":5,"6":7}]'
07

Jika data yang dideserialisasi bukan dokumen JSON yang valid, a akan dimunculkan

Berubah di versi 3. 6. Semua parameter sekarang.

dekode(s)

Kembalikan representasi Python dari s (contoh yang berisi dokumen JSON)

akan dimunculkan jika dokumen JSON yang diberikan tidak valid

dekode_mentah(s)

Dekode dokumen JSON dari s (dimulai dengan dokumen JSON) dan kembalikan 2-Tuple representasi Python dan indeks di s tempat dokumen berakhir

Ini dapat digunakan untuk mendekode dokumen JSON dari string yang mungkin memiliki data asing di bagian akhir

kelas json. JSONEncoder(* , skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)

Encoder JSON yang dapat diperluas untuk struktur data Python

Mendukung objek dan tipe berikut secara default

Piton

JSON

dikt

obyek

daftar, tupel

Himpunan

str

rangkaian

int, float, Enum yang diturunkan dari int & float

nomor

BENAR

BENAR

PALSU

Salah

Tidak ada

batal

Berubah di versi 3. 4. Menambahkan dukungan untuk kelas Enum turunan int dan float.

Untuk memperluas ini untuk mengenali objek lain, subkelas dan terapkan metode dengan metode lain yang mengembalikan objek serial untuk

>>> import json
>>> json.dumps([1, 2, 3, {'4': 5, '6': 7}], separators=(',', ':'))
'[1,2,3,{"4":5,"6":7}]'
13 jika memungkinkan, jika tidak, ia harus memanggil implementasi superclass (untuk menaikkan )

Jika skipkey salah (default), a akan dimunculkan saat mencoba menyandikan kunci yang bukan , , atau

>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
    "4": 5,
    "6": 7
}
6. Jika skipkeys benar, item seperti itu akan dilewati begitu saja

Jika sure_ascii benar (default), keluaran dijamin akan membuat semua karakter non-ASCII yang masuk lolos. Jika sure_ascii salah, karakter ini akan ditampilkan apa adanya

Jika check_circular benar (default), maka daftar, dicts, dan objek yang disandikan khusus akan diperiksa untuk referensi melingkar selama penyandian untuk mencegah rekursi tak terbatas (yang akan menyebabkan a ). Jika tidak, tidak ada pemeriksaan yang dilakukan

Jika allow_nan benar (default), maka

>>> 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, dan
>>> 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 akan dikodekan seperti itu. Perilaku ini tidak sesuai dengan spesifikasi JSON, tetapi konsisten dengan sebagian besar encoder dan decoder berbasis JavaScript. Kalau tidak, itu akan menjadi untuk menyandikan pelampung tersebut

Jika sort_keys benar (default.

>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
    "4": 5,
    "6": 7
}
1), maka keluaran kamus akan diurutkan berdasarkan kunci;

Jika indent adalah bilangan bulat atau string non-negatif, maka elemen array JSON dan anggota objek akan dicetak cantik dengan tingkat indentasi tersebut. Tingkat indentasi 0, negatif, atau

>>> 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 hanya akan menyisipkan baris baru.
>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
    "4": 5,
    "6": 7
}
6 (default) memilih representasi yang paling ringkas. Menggunakan indentasi bilangan bulat positif yang banyak ruang per tingkat. Jika indentasi berupa string (seperti
>>> 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), string tersebut digunakan untuk mengindentasi setiap level

Berubah di versi 3. 2. Izinkan string untuk indentasi selain bilangan bulat.

Jika ditentukan, pemisah harus berupa tuple ________4______7. Standarnya adalah

>>> 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 jika inden adalah
>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
    "4": 5,
    "6": 7
}
6 dan
>>> 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 sebaliknya. Untuk mendapatkan representasi JSON yang paling ringkas, Anda harus menentukan
>>> 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 untuk menghilangkan spasi

Berubah di versi 3. 4. Gunakan

>>> 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 sebagai default jika indent bukan
>>> import json
>>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
{
    "4": 5,
    "6": 7
}
6.

Jika ditentukan, default harus berupa fungsi yang dipanggil untuk objek yang tidak dapat diserialisasi. Itu harus mengembalikan versi objek yang dapat dikodekan JSON atau menaikkan a. Jika tidak ditentukan, dinaikkan

Berubah di versi 3. 6. Semua parameter sekarang.

default(o)

Terapkan metode ini dalam subkelas sedemikian rupa sehingga mengembalikan objek yang dapat diserialkan untuk o, atau memanggil implementasi dasar (untuk menaikkan a )

Misalnya, untuk mendukung iterator sewenang-wenang, Anda dapat mengimplementasikan seperti ini

def default(self, o):
   try:
       iterable = iter(o)
   except TypeError:
       pass
   else:
       return list(iterable)
   # Let the base class default method raise the TypeError
   return json.JSONEncoder.default(self, o)

enkode(o)

Mengembalikan representasi string JSON dari struktur data Python, o. Sebagai contoh

>>> json.JSONEncoder().encode({"foo": ["bar", "baz"]})
'{"foo": ["bar", "baz"]}'

iterencode(o)

Enkode objek yang diberikan, o, dan hasilkan setiap representasi string yang tersedia. Sebagai contoh

for chunk in json.JSONEncoder().iterencode(bigobject):
    mysocket.write(chunk)

Pengecualian

pengecualian json. JSONDecodeError(msg , doc, pos)

Subkelas dari dengan atribut tambahan berikut

pesan

Pesan kesalahan yang tidak diformat

dokter

Dokumen JSON sedang diuraikan

pos

Indeks awal dokumen tempat penguraian gagal

lineno

Garis yang sesuai dengan pos

colno

Kolom yang sesuai dengan pos

Baru di versi 3. 5

Kepatuhan Standar dan Interoperabilitas

Format JSON ditentukan oleh RFC 7159 dan oleh ECMA-404. Bagian ini merinci tingkat kepatuhan modul ini terhadap RFC. Untuk kesederhanaan, dan subclass, dan parameter selain yang disebutkan secara eksplisit, tidak dipertimbangkan

Modul ini tidak mematuhi RFC secara ketat, menerapkan beberapa ekstensi yang merupakan JavaScript yang valid tetapi bukan JSON yang valid. Secara khusus

  • Nilai angka tak terbatas dan NaN diterima dan dihasilkan;

  • Nama berulang dalam objek diterima, dan hanya nilai dari pasangan nama-nilai terakhir yang digunakan

Karena RFC mengizinkan parser yang sesuai dengan RFC untuk menerima teks input yang tidak sesuai dengan RFC, deserializer modul ini secara teknis sesuai dengan RFC di bawah pengaturan default

Pengkodean Karakter

RFC mengharuskan JSON direpresentasikan menggunakan UTF-8, UTF-16, atau UTF-32, dengan UTF-8 sebagai default yang disarankan untuk interoperabilitas maksimum

Seperti yang diizinkan, meskipun tidak diwajibkan, oleh RFC, serializer modul ini menetapkan sure_ascii=True secara default, sehingga keluar dari keluaran sehingga string yang dihasilkan hanya berisi karakter ASCII

Selain parameter sure_ascii, modul ini didefinisikan secara ketat dalam hal konversi antara objek Python dan , dan karenanya tidak secara langsung mengatasi masalah pengkodean karakter

RFC melarang penambahan byte order mark (BOM) ke awal teks JSON, dan serializer modul ini tidak menambahkan BOM ke outputnya. RFC mengizinkan, tetapi tidak mengharuskan, deserializer JSON untuk mengabaikan BOM awal dalam inputnya. Deserializer modul ini memunculkan a ketika BOM awal ada

RFC tidak secara eksplisit melarang string JSON yang berisi urutan byte yang tidak sesuai dengan karakter Unicode yang valid (mis. g. pengganti UTF-16 yang tidak berpasangan), tetapi mencatat bahwa mereka dapat menyebabkan masalah interoperabilitas. Secara default, modul ini menerima dan mengeluarkan (bila ada dalam aslinya) poin kode untuk urutan tersebut

Nilai Angka Tak Terbatas dan NaN

RFC tidak mengizinkan representasi nilai angka tak terbatas atau NaN. Meskipun demikian, secara default, modul ini menerima dan menampilkan

>>> 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, dan
>>> 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 seolah-olah mereka adalah nilai literal nomor JSON yang valid

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

Di serializer, parameter allow_nan dapat digunakan untuk mengubah perilaku ini. Di deserializer, parameter parse_constant dapat digunakan untuk mengubah perilaku ini

Nama Berulang Dalam Objek

RFC menetapkan bahwa nama dalam objek JSON harus unik, tetapi tidak mengamanatkan bagaimana nama berulang dalam objek JSON harus ditangani. Secara default, modul ini tidak memunculkan pengecualian;

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

Parameter object_pairs_hook dapat digunakan untuk mengubah perilaku ini

Nilai Non-Objek, Non-Array Tingkat Atas

Versi lama JSON yang ditentukan oleh RFC 4627 yang sudah usang mensyaratkan bahwa nilai tingkat atas teks JSON harus berupa objek atau larik JSON (Python atau ), dan tidak boleh berupa nilai null, boolean, angka, atau string JSON. RFC 7159 menghapus batasan itu, dan modul ini tidak dan tidak pernah menerapkan batasan itu baik dalam serializer maupun deserializer-nya

Terlepas dari itu, untuk interoperabilitas maksimum, Anda mungkin ingin secara sukarela mematuhi batasan itu sendiri

Keterbatasan Implementasi

Beberapa implementasi deserializer JSON mungkin membatasi

  • ukuran teks JSON yang diterima

  • tingkat maksimum penumpukan objek dan larik JSON

  • rentang dan presisi nomor JSON

  • konten dan panjang maksimum string JSON

Modul ini tidak memaksakan batasan seperti itu di luar tipe data Python yang relevan itu sendiri atau juru bahasa Python itu sendiri

Saat membuat serial ke JSON, berhati-hatilah dengan batasan apa pun dalam aplikasi yang dapat menggunakan JSON Anda. Secara khusus, adalah umum untuk nomor JSON untuk dideserialisasi menjadi nomor presisi ganda IEEE 754 dan dengan demikian tunduk pada rentang representasi dan batasan presisi. Ini sangat relevan saat membuat serialisasi nilai Python dengan besaran yang sangat besar, atau saat membuat serialisasi contoh tipe numerik "eksotis" seperti

Antarmuka Baris Perintah

Kode sumber. Lib/json/alat. py


Modul ini menyediakan antarmuka baris perintah sederhana untuk memvalidasi dan mencetak objek JSON dengan cantik

Jika argumen

>>> import json
>>> json.dumps([1, 2, 3, {'4': 5, '6': 7}], separators=(',', ':'))
'[1,2,3,{"4":5,"6":7}]'
54 dan
>>> import json
>>> json.dumps([1, 2, 3, {'4': 5, '6': 7}], separators=(',', ':'))
'[1,2,3,{"4":5,"6":7}]'
55 opsional tidak ditentukan, dan akan digunakan masing-masing

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

Berubah di versi 3. 5. Output sekarang dalam urutan yang sama dengan input. Gunakan opsi untuk mengurutkan keluaran kamus menurut abjad berdasarkan kunci.

Opsi baris perintah

infile

File JSON yang akan divalidasi atau dicetak cantik

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

Jika infile tidak ditentukan, baca dari

outfile

Tulis output dari infile ke outfile yang diberikan. Jika tidak, tulis ke

--sort-kunci

Urutkan keluaran kamus menurut abjad berdasarkan kunci

Baru di versi 3. 5

--no-pastikan-ascii

Nonaktifkan pelolosan karakter non-ascii, lihat untuk informasi lebih lanjut

Baru di versi 3. 9

--json-baris

Parsing setiap baris input sebagai objek JSON terpisah

Baru di versi 3. 8

--indent, --tab, -, --compact

Opsi yang saling eksklusif untuk kontrol spasi

Baru di versi 3. 9

-h, --help

Tampilkan pesan bantuan

Catatan kaki

Sebagaimana dicatat dalam kesalahan untuk RFC 7159, JSON mengizinkan karakter literal U+2028 (LINE SEPARATOR) dan U+2029 (PARAGRAPH SEPARATOR) dalam string, sedangkan JavaScript (pada ECMAScript Edition 5. 1) tidak

Bagaimana cara mengubah objek respons ke kamus dengan Python?

Ini bekerja dengan memuat objek tanggapan menggunakan. get() fungsi. Kami kemudian menerapkan. json() ke objek respons untuk mengubahnya menjadi kamus Python .

Bagaimana cara mengonversi respons json ke kamus?

Untuk mengonversi string Python JSON ke Kamus, gunakan json. beban() fungsi. Perhatikan bahwa hanya jika konten JSON adalah Objek JSON, dan saat diuraikan menggunakan fungsi beban(), kita mendapatkan objek Kamus Python. Konten JSON dengan berbagai objek akan dikonversi menjadi daftar Python dengan fungsi beban()

Bagaimana cara mengembalikan nilai dari daftar kamus?

Berikut adalah 3 pendekatan untuk mengekstrak nilai kamus sebagai daftar dengan Python. .
(1) Menggunakan fungsi list(). my_list = daftar(my_dict. nilai())
(2) Menggunakan Pemahaman Daftar. my_list = [i untuk i di my_dict. nilai()]
(3) Menggunakan For Loop. my_list = [] untuk i di my_dict. nilai(). daftarku. tambahkan (i)

Bagaimana cara mengonversi permintaan ke kamus dengan Python?

Setiap kali pustaka permintaan digunakan untuk membuat permintaan, objek Respons dikembalikan. Pustaka permintaan Python menyediakan metode yang bermanfaat, json() , untuk mengonversi objek Respons ke kamus Python.