Rumah pembangunan bahagian belakang Tutorial Python 深入解析Python编程中JSON模块的使用

深入解析Python编程中JSON模块的使用

Jun 06, 2016 am 11:14 AM
json python

JSON编码支持的基本数据类型为 None , bool , int , float 和 str , 以及包含这些类型数据的lists,tuples和dictionaries。 对于dictionaries,keys需要是字符串类型(字典中任何非字符串类型的key在编码时会先转换为字符串)。 为了遵循JSON规范,你应该只编码Python的lists和dictionaries。 而且,在web应用程序中,顶层对象被编码为一个字典是一个标准做法。

JSON编码的格式对于Python语法而已几乎是完全一样的,除了一些小的差异之外。 比如,True会被映射为true,False被映射为false,而None会被映射为null。 下面是一个例子,演示了编码后的字符串效果:

1

2

3

4

5

6

7

8

>>> json.dumps(False)

'false'

>>> d = {'a': True,

...   'b': 'Hello',

...   'c': None}

>>> json.dumps(d)

'{"b": "Hello", "c": null, "a": true}'

>>>

Salin selepas log masuk

如果你试着去检查JSON解码后的数据,你通常很难通过简单的打印来确定它的结构, 特别是当数据的嵌套结构层次很深或者包含大量的字段时。 为了解决这个问题,可以考虑使用pprint模块的 pprint() 函数来代替普通的 print() 函数。 它会按照key的字母顺序并以一种更加美观的方式输出。 下面是一个演示如何漂亮的打印输出Twitter上搜索结果的例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

>>> from urllib.request import urlopen

>>> import json

>>> u = urlopen('http://search.twitter.com/search.json?q=python&rpp=5')

>>> resp = json.loads(u.read().decode('utf-8'))

>>> from pprint import pprint

>>> pprint(resp)

{'completed_in': 0.074,

'max_id': 264043230692245504,

'max_id_str': '264043230692245504',

'next_page': '?page=2&max_id=264043230692245504&q=python&rpp=5',

'page': 1,

'query': 'python',

'refresh_url': '?since_id=264043230692245504&q=python',

'results': [{'created_at': 'Thu, 01 Nov 2012 16:36:26 +0000',

      'from_user': ...

      },

      {'created_at': 'Thu, 01 Nov 2012 16:36:14 +0000',

      'from_user': ...

      },

      {'created_at': 'Thu, 01 Nov 2012 16:36:13 +0000',

      'from_user': ...

      },

      {'created_at': 'Thu, 01 Nov 2012 16:36:07 +0000',

      'from_user': ...

      }

      {'created_at': 'Thu, 01 Nov 2012 16:36:04 +0000',

      'from_user': ...

      }],

'results_per_page': 5,

'since_id': 0,

'since_id_str': '0'}

>>>

Salin selepas log masuk

一般来讲,JSON解码会根据提供的数据创建dicts或lists。 如果你想要创建其他类型的对象,可以给 json.loads() 传递object_pairs_hook或object_hook参数。 例如,下面是演示如何解码JSON数据并在一个OrderedDict中保留其顺序的例子:

1

2

3

4

5

6

>>> s = '{"name": "ACME", "shares": 50, "price": 490.1}'

>>> from collections import OrderedDict

>>> data = json.loads(s, object_pairs_hook=OrderedDict)

>>> data

OrderedDict([('name', 'ACME'), ('shares', 50), ('price', 490.1)])

>>>

Salin selepas log masuk

下面是如何将一个JSON字典转换为一个Python对象例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

>>> class JSONObject:

...   def __init__(self, d):

...     self.__dict__ = d

...

>>>

>>> data = json.loads(s, object_hook=JSONObject)

>>> data.name

'ACME'

>>> data.shares

50

>>> data.price

490.1

>>>

Salin selepas log masuk

最后一个例子中,JSON解码后的字典作为一个单个参数传递给 __init__() 。 然后,你就可以随心所欲的使用它了,比如作为一个实例字典来直接使用它。

在编码JSON的时候,还有一些选项很有用。 如果你想获得漂亮的格式化字符串后输出,可以使用 json.dumps() 的indent参数。 它会使得输出和pprint()函数效果类似。比如:

1

2

3

4

5

6

7

8

9

>>> print(json.dumps(data))

{"price": 542.23, "name": "ACME", "shares": 100}

>>> print(json.dumps(data, indent=4))

{

  "price": 542.23,

  "name": "ACME",

  "shares": 100

}

>>>

Salin selepas log masuk

对象实例通常并不是JSON可序列化的。例如:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

>>> class Point:

...   def __init__(self, x, y):

...     self.x = x

...     self.y = y

...

>>> p = Point(2, 3)

>>> json.dumps(p)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "/usr/local/lib/python3.3/json/__init__.py", line 226, in dumps

    return _default_encoder.encode(obj)

  File "/usr/local/lib/python3.3/json/encoder.py", line 187, in encode

    chunks = self.iterencode(o, _one_shot=True)

  File "/usr/local/lib/python3.3/json/encoder.py", line 245, in iterencode

    return _iterencode(o, 0)

  File "/usr/local/lib/python3.3/json/encoder.py", line 169, in default

    raise TypeError(repr(o) + " is not JSON serializable")

TypeError: <__main__.Point object at 0x1006f2650> is not JSON serializable

>>>

Salin selepas log masuk

如果你想序列化对象实例,你可以提供一个函数,它的输入是一个实例,返回一个可序列化的字典。例如:

1

2

3

4

def serialize_instance(obj):

  d = { '__classname__' : type(obj).__name__ }

  d.update(vars(obj))

  return d

Salin selepas log masuk

如果你想反过来获取这个实例,可以这样做:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

# Dictionary mapping names to known classes

classes = {

  'Point' : Point

}

 

def unserialize_object(d):

  clsname = d.pop('__classname__', None)

  if clsname:

    cls = classes[clsname]

    obj = cls.__new__(cls) # Make instance without calling __init__

    for key, value in d.items():

      setattr(obj, key, value)

      return obj

  else:

    return d

Salin selepas log masuk

下面是如何使用这些函数的例子:

1

2

3

4

5

6

7

8

9

10

11

12

>>> p = Point(2,3)

>>> s = json.dumps(p, default=serialize_instance)

>>> s

'{"__classname__": "Point", "y": 3, "x": 2}'

>>> a = json.loads(s, object_hook=unserialize_object)

>>> a

<__main__.Point object at 0x1017577d0>

>>> a.x

2

>>> a.y

3

>>>

Salin selepas log masuk

json 模块还有很多其他选项来控制更低级别的数字、特殊值如NaN等的解析。 可以参考官方文档获取更多细节。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara mengubahsuai kandungan komen dalam XML Cara mengubahsuai kandungan komen dalam XML Apr 02, 2025 pm 06:15 PM

Untuk fail XML kecil, anda boleh menggantikan kandungan anotasi secara langsung dengan editor teks; Untuk fail besar, adalah disyorkan untuk menggunakan parser XML untuk mengubahnya untuk memastikan kecekapan dan ketepatan. Berhati -hati apabila memadam komen XML, menyimpan komen biasanya membantu pemahaman dan penyelenggaraan kod. Petua Lanjutan menyediakan kod sampel Python untuk mengubahsuai komen menggunakan parser XML, tetapi pelaksanaan khusus perlu diselaraskan mengikut perpustakaan XML yang digunakan. Beri perhatian kepada isu pengekodan semasa mengubah suai fail XML. Adalah disyorkan untuk menggunakan pengekodan UTF-8 dan menentukan format pengekodan.

Adakah kelajuan penukaran cepat apabila menukar XML ke PDF pada telefon bimbit? Adakah kelajuan penukaran cepat apabila menukar XML ke PDF pada telefon bimbit? Apr 02, 2025 pm 10:09 PM

Kelajuan XML mudah alih ke PDF bergantung kepada faktor -faktor berikut: kerumitan struktur XML. Kaedah Penukaran Konfigurasi Perkakasan Mudah Alih (Perpustakaan, Algoritma) Kaedah Pengoptimuman Kualiti Kod (Pilih perpustakaan yang cekap, mengoptimumkan algoritma, data cache, dan menggunakan pelbagai threading). Secara keseluruhannya, tidak ada jawapan mutlak dan ia perlu dioptimumkan mengikut keadaan tertentu.

Adakah pengubahsuaian XML memerlukan pengaturcaraan? Adakah pengubahsuaian XML memerlukan pengaturcaraan? Apr 02, 2025 pm 06:51 PM

Mengubah kandungan XML memerlukan pengaturcaraan, kerana ia memerlukan penemuan tepat nod sasaran untuk menambah, memadam, mengubah suai dan menyemak. Bahasa pengaturcaraan mempunyai perpustakaan yang sepadan untuk memproses XML dan menyediakan API untuk melaksanakan operasi yang selamat, cekap dan terkawal seperti pangkalan data operasi.

Adakah terdapat aplikasi mudah alih yang boleh menukar XML ke PDF? Adakah terdapat aplikasi mudah alih yang boleh menukar XML ke PDF? Apr 02, 2025 pm 08:54 PM

Permohonan yang menukarkan XML terus ke PDF tidak dapat dijumpai kerana mereka adalah dua format yang berbeza. XML digunakan untuk menyimpan data, manakala PDF digunakan untuk memaparkan dokumen. Untuk melengkapkan transformasi, anda boleh menggunakan bahasa pengaturcaraan dan perpustakaan seperti Python dan ReportLab untuk menghuraikan data XML dan menghasilkan dokumen PDF.

Apakah proses menukar XML ke dalam imej? Apakah proses menukar XML ke dalam imej? Apr 02, 2025 pm 08:24 PM

Untuk menukar imej XML, anda perlu menentukan struktur data XML terlebih dahulu, kemudian pilih perpustakaan grafik yang sesuai (seperti matplotlib Python) dan kaedah, pilih strategi visualisasi berdasarkan struktur data, pertimbangkan volum data dan format imej, lakukan pemprosesan batch atau gunakan perpustakaan yang cekap, dan akhirnya simpan sebagai PNG, JPEG, atau SVG mengikut keperluan.

Cara Membuka Format XML Cara Membuka Format XML Apr 02, 2025 pm 09:00 PM

Gunakan kebanyakan editor teks untuk membuka fail XML; Jika anda memerlukan paparan pokok yang lebih intuitif, anda boleh menggunakan editor XML, seperti editor XML oksigen atau XMLSPY; Jika anda memproses data XML dalam program, anda perlu menggunakan bahasa pengaturcaraan (seperti Python) dan perpustakaan XML (seperti XML.Etree.ElementTree) untuk menghuraikan.

Bagaimana cara menukar XML ke PDF di telefon anda dengan kualiti tinggi? Bagaimana cara menukar XML ke PDF di telefon anda dengan kualiti tinggi? Apr 02, 2025 pm 09:48 PM

Tukar XML ke PDF dengan kualiti tinggi pada telefon bimbit anda memerlukan: Parsing XML di awan dan menjana PDF menggunakan platform pengkomputeran tanpa pelayan. Pilih Parser XML yang cekap dan perpustakaan penjanaan PDF. Mengendalikan kesilapan dengan betul. Menggunakan sepenuhnya kuasa pengkomputeran awan untuk mengelakkan tugas berat pada telefon anda. Laraskan kerumitan mengikut keperluan, termasuk memproses struktur XML kompleks, menghasilkan PDF multi-halaman, dan menambah imej. Cetak maklumat log untuk membantu debug. Mengoptimumkan prestasi, pilih parser yang cekap dan perpustakaan PDF, dan boleh menggunakan pengaturcaraan asynchronous atau data XML preprocessing. Memastikan kualiti kod yang baik dan penyelenggaraan.

Bagaimana untuk menentukan jenis enum dalam pemalar rentetan protobuf dan bersekutu? Bagaimana untuk menentukan jenis enum dalam pemalar rentetan protobuf dan bersekutu? Apr 02, 2025 pm 03:36 PM

Isu Menentukan Penghitungan Tetap String Dalam Protobuf Apabila menggunakan Protobuf, anda sering menghadapi situasi di mana anda perlu mengaitkan jenis enum dengan pemalar rentetan ...

See all articles