python json序列化对象_Python学习之json序列化
一、什么是序列化
在我們存儲(chǔ)數(shù)據(jù)或者網(wǎng)絡(luò)傳輸數(shù)據(jù)的時(shí)候,需要對(duì)我們的對(duì)象進(jìn)行處理,把對(duì)象處理成方便存儲(chǔ)和傳輸?shù)臄?shù)據(jù)格式。這個(gè)過(guò)程叫序列化,不同的序列化結(jié)果也不同,但目的是一樣的,都是為了存儲(chǔ)和傳輸
在Python中三種序列化的方案:
pickle,可以將我們Python中任意數(shù)據(jù)類型轉(zhuǎn)化為bytes并寫(xiě)入到文件中。同樣也可以把文件中寫(xiě)好的bytes轉(zhuǎn)換回到我們Python的數(shù)據(jù)-這個(gè)過(guò)程被稱為反序列化。
shelve簡(jiǎn)單另類的一種序列化方案。有點(diǎn)類似于Redis,可以作為一種小型的數(shù)據(jù)庫(kù)來(lái)使用。
json,將Python中常見(jiàn)的字典,列表轉(zhuǎn)化成字符串,是目前前后端數(shù)據(jù)交互使用頻率最高的一種數(shù)據(jù)模式。
二、json
1.什么是json
json是前后端交互的樞紐,相當(dāng)于編程界的普通話,前后端用Python溝通。因?yàn)閖son的語(yǔ)法格式可以完美的表示出一個(gè)對(duì)象。那么什么是json:json全稱JavaScript object notation,即js對(duì)象簡(jiǎn)譜,例如下面代碼示例:
{
"id": 1,
"title": "Python從入門(mén)到放棄(第二版)",
"pub_date": "2018-01-11",
"category": "Python",
"publisher": {
"id": 1,
"name": "北京出版社"
},
"post_authors": [
{
"id": 2,
"name": "佚名"
}
]
}
這段形如Python字典的東西在JavaScript里面叫json,其實(shí)是一樣的。我們發(fā)現(xiàn)用這樣的數(shù)據(jù)結(jié)構(gòu)可以完美的表示出任何對(duì)象,并且可以完整的把對(duì)象表示出來(lái)。只要代碼格式比較好,那么可讀性也挺強(qiáng)的,所以大家公認(rèn)用這樣一種數(shù)據(jù)結(jié)構(gòu)作為數(shù)據(jù)交互的格式。
在json之前,通常用的數(shù)據(jù)結(jié)構(gòu)為XML,形如:
Python從入門(mén)到放棄(第二版)2018-01-11
Python
1
北京出版社
總之,XML格式的文件在維護(hù)和處理上相比json文件很難解析,所以后來(lái)大都傾向于使用json這一數(shù)據(jù)結(jié)構(gòu)了。
2.json在Python中的用法
字典 -> json
要先引入json模塊,再進(jìn)行處理
import json
dic = {"姓名": "程序猿", "年齡": 28, "頭發(fā)": None}
s = json.dumps(dic)
print(s)
# 輸出:
>>>{"\u59d3\u540d": "\u7a0b\u5e8f\u733f", "\u5e74\u9f84": 28, "\u5934\u53d1": null}
結(jié)果很不友好啊. 那如何處理成中?呢? 在dumps的時(shí)候給出另一個(gè)參數(shù)ensure_ascii=False就可以了了。
import json
dic = {"姓名": "程序猿", "年齡": 28, "頭發(fā)": None}
s = json.dumps(dic, ensure_ascii=False)
print(s)
# 輸出:
>>>{"姓名": "程序猿", "年齡": 28, "頭發(fā)": null}
json -> 字典
上面介紹的是如何把字典格式的數(shù)據(jù)轉(zhuǎn)化為json,那么怎么把前端傳遞過(guò)來(lái)的json文件轉(zhuǎn)化為字典格式呢:
import json
s = '{"姓名": "程序猿", "年齡": 28, "頭發(fā)": null}'
# 注意此處要加引號(hào),表示s為字符串-the JSON object must be str
dic = json.loads(s)
print(dic)
print(type(dic))
# 輸出:
>>> {'姓名': '程序猿', '年齡': 28, '頭發(fā)': None}
>>>
寫(xiě)入/讀取json文件
json也可以像pickle一樣把序列化的結(jié)果寫(xiě)入到文件中:
import json
dic = {"姓名": "程序猿", "年齡": 28, "頭發(fā)": None}
f = open('test.json', mode='w', encoding="utf-8")
# 把對(duì)象打散成json寫(xiě)入到文件中
json.dump(dic, f, ensure_ascii=False)
f.close()
test.json中顯示:
{
"姓名": "程序猿",
"年齡": 28,
"頭發(fā)": null
}
同樣也可以從文件中讀取一個(gè)json:
import json
f = open('test.json', mode='r', encoding="utf-8")
dic = json.load(f)
f.close()
print(dic)
# 輸出:
>>> {'姓名': '程序猿', '年齡': 28, '頭發(fā)': None}
注意: 我們可以向同一個(gè)文件中寫(xiě)入多個(gè)json串,但是讀不行
import json
lst = [
{"a": 1},
{'b': 2},
{'c': 3}
]
f = open("test.json", mode="w", encoding="utf-8")
for dic in lst:
json.dump(dic, f)
f.close()
test.json中顯示:

可以看到此時(shí)文件中的內(nèi)容是一行的,所以會(huì)有紅色下劃線顯示報(bào)錯(cuò)信息,這在讀取的時(shí)候是無(wú)法正常讀取的。如何解決讀取問(wèn)題呢?兩種方案。
方案一:
把所有的內(nèi)容準(zhǔn)備好統(tǒng)一進(jìn)行寫(xiě)入和讀取,但是這樣處理,如果數(shù)據(jù)量小還好,數(shù)據(jù)量大的話就很麻煩了。
方案二:
不用dump方法,改用dumps和loads,對(duì)每一行分別進(jìn)行處理。
import json
lst = [
{"a": 1},
{'b': 2},
{'c': 3}
]
# 寫(xiě)入
f = open("test.json", mode="w", encoding="utf-8")
for dic in lst:
s = json.dumps(dic, ensure_ascii=True) + '\n'
f.write(s)
f.close()
# 讀取
f = open("test.json", mode='r', encoding='utf-8')
for line in f:
d = json.loads(line.strip())
print(d)
f.close()
打印結(jié)果為:
{'a': 1}
{'b': 2}
{'c': 3}
這樣的話就能正常讀取了!
總結(jié)
以上是生活随笔為你收集整理的python json序列化对象_Python学习之json序列化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 字符变量赋值规则_Java的常量、变量、
- 下一篇: python语言的注释语句引导符_Pyt