JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式。它基于JavaScript語(yǔ)法,但也可以被其他語(yǔ)言如Python解析和生成。Python內(nèi)置了對(duì)JSON的支持,可以輕松地將Python對(duì)象序列化為JSON格式的字符串,以及將JSON字符串反序列化為Python對(duì)象。
JSON和Python對(duì)象的對(duì)應(yīng)關(guān)系
JSON中的數(shù)據(jù)類(lèi)型和Python對(duì)象的對(duì)應(yīng)關(guān)系如下:
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number (int/float) | int/float |
true | True |
false | False |
null | None |
Python中可以使用json模塊來(lái)進(jìn)行JSON數(shù)據(jù)的處理。
將Python對(duì)象轉(zhuǎn)換為JSON
使用json模塊的dumps()函數(shù)可以將Python對(duì)象轉(zhuǎn)換為JSON格式的字符串。例如,將一個(gè)Python字典轉(zhuǎn)換為JSON格式的字符串:
importjson data={'name':'Alice','age':20,'is_student':True} json_str=json.dumps(data) print(json_str)
輸出結(jié)果為:
{"name":"Alice","age":20,"is_student":true}
可以看到,dumps()函數(shù)將Python字典轉(zhuǎn)換為了JSON格式的字符串。注意,JSON格式的字符串中,字符串需要用雙引號(hào)括起來(lái),而不是單引號(hào)。
將JSON轉(zhuǎn)換為Python對(duì)象
使用json模塊的loads()函數(shù)可以將JSON格式的字符串轉(zhuǎn)換為Python對(duì)象。例如,將上面生成的JSON格式的字符串轉(zhuǎn)換為Python字典:
json_str='{"name":"Alice","age":20,"is_student":true}' data=json.loads(json_str) print(data)
輸出結(jié)果為:
{'name':'Alice','age':20,'is_student':True}
可以看到,loads()函數(shù)將JSON格式的字符串轉(zhuǎn)換為了Python字典。
處理JSON文件
可以使用json模塊的dump()函數(shù)和load()函數(shù)來(lái)處理JSON文件。dump()函數(shù)可以將Python對(duì)象序列化為JSON格式的字符串,并將其寫(xiě)入文件中。load()函數(shù)可以從文件中讀取JSON格式的字符串,并將其反序列化為Python對(duì)象。
例如,將Python字典寫(xiě)入JSON文件:
data={'name':'Alice','age':20,'is_student':True} withopen('data.json','w')asf: json.dump(data,f)
從JSON文件中讀取Python對(duì)象:
withopen('data.json','r')asf: data=json.load(f) print(data)
輸出結(jié)果為:
{'name':'Alice','age':20,'is_student':True}
JSON格式的高級(jí)處理
在處理JSON格式數(shù)據(jù)時(shí),還可以使用json模塊的一些高級(jí)功能。例如,json.JSONEncoder和json.JSONDecoder類(lèi)可以自定義JSON格式的編碼和解碼方式。此外,還可以使用json.JSONEncoder的default()方法和json.JSONDecoder的objecthook()方法來(lái)自定義某些數(shù)據(jù)類(lèi)型的JSON編碼和解碼方式。
下面是一個(gè)示例,展示如何使用json.JSONEncoder和json.JSONDecoder自定義JSON格式的編碼和解碼方式。假設(shè)有一個(gè)Person類(lèi),其對(duì)象包含姓名和年齡兩個(gè)屬性:
classPerson: def__init__(self,name,age): self.name=name self.age=age
現(xiàn)在想要將Person對(duì)象序列化為JSON格式的字符串,并將JSON字符串反序列化為Person對(duì)象。首先,需要定義一個(gè)自定義的JSON編碼器:
classPersonEncoder(json.JSONEncoder): defdefault(self,obj): ifisinstance(obj,Person): return{'name':obj.name,'age':obj.age} returnsuper().default(obj)
PersonEncoder類(lèi)繼承自json.JSONEncoder類(lèi),并覆蓋了default()方法。default()方法接收一個(gè)參數(shù)obj,表示要序列化的Python對(duì)象。如果obj是Person對(duì)象,則將其轉(zhuǎn)換為一個(gè)包含姓名和年齡屬性的字典;否則,調(diào)用父類(lèi)的default()方法進(jìn)行默認(rèn)處理。
然后,可以使用自定義的編碼器將Person對(duì)象序列化為JSON格式的字符串:
person=Person('Alice',20) json_str=json.dumps(person,cls=PersonEncoder) print(json_str)
輸出結(jié)果為:
{"name":"Alice","age":20}
可以看到,Person對(duì)象被成功地序列化為了JSON格式的字符串。
接下來(lái),需要定義一個(gè)自定義的JSON解碼器:
classPersonDecoder(json.JSONDecoder): defobject_hook(self,dct): if'name'indctand'age'indct: returnPerson(dct['name'],dct['age']) returndct
PersonDecoder類(lèi)繼承自json.JSONDecoder類(lèi),并覆蓋了object_hook()方法。object_hook()方法接收一個(gè)參數(shù)dct,表示要反序列化的JSON數(shù)據(jù)。如果dct是包含name和age屬性的字典,則將其轉(zhuǎn)換為一個(gè)Person對(duì)象;否則,返回原始的字典數(shù)據(jù)。
最后,可以使用自定義的解碼器將JSON格式的字符串反序列化為Person對(duì)象:
json_str='{"name":"Alice","age":20}' person=json.loads(json_str,cls=PersonDecoder) print(person.name,person.age)
輸出結(jié)果為:
Alice20
可以看到,JSON格式的字符串被成功地反序列化為了Person對(duì)象。
結(jié)論
在Python中,使用json模塊可以輕松地處理JSON格式的數(shù)據(jù)??梢詫ython對(duì)象序列化為JSON格式的字符串,將JSON格式的字符串反序列化為Python對(duì)象,以及處理JSON文件。此外,還可以使用json.JSONEncoder和json.JSONDecoder類(lèi)來(lái)自定義JSON格式的編碼和解碼方式。掌握了這些知識(shí),可以更加靈活地處理JSON格式的數(shù)據(jù).
審核編輯:劉清
-
字符串
+關(guān)注
關(guān)注
1文章
584瀏覽量
20552 -
python
+關(guān)注
關(guān)注
56文章
4798瀏覽量
84810 -
JSON
+關(guān)注
關(guān)注
0文章
119瀏覽量
6981
原文標(biāo)題:網(wǎng)絡(luò)工程師學(xué)Python-19-JSON
文章出處:【微信號(hào):網(wǎng)絡(luò)技術(shù)干貨圈,微信公眾號(hào):網(wǎng)絡(luò)技術(shù)干貨圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論