寫在之前
我用了兩天的時間來介紹的 XML,如果沒看的話建議先去看看。就數據傳遞而言, XML 是一種選擇,當然這裡還有另一種選擇 -- 「JSON」。它是一種輕量級的數據交換格式,如果各位想要做 Web 編程的話,則肯定會用到它。下面我們就開始今天的學習。
JSON
首先我們參考《維基百科》中的相關內容,來對 JSON 做如下介紹:
JSON ( JavaScript Object Notation ) 是一種由道格拉斯構想設計、輕量級的數據交換語言,以文字為基礎,且易於讓人閱讀。儘管 JSON 是 JavaScript 的一個子集,但 JSON 是獨立於語言的文本格式,並且採用了類似 C 語言家族的一些習慣。關於 JSON 更為詳細的內容,可以參考其官方網站,在這我截取部分內容,讓大家更好的了解一下 JSON 的結構。
JSON 構建於兩種結構基礎之上:
Python 標準庫中有 JSON 模塊,主要是執行序列化和反序列化功能。
基本操作
JSON 模塊相比於 XML 來說真的是簡單多了:
>>> import json
>>> json.__all__
['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder']
1.encoding:dumps()
>>> data = [{'name':'rocky','like':('python','c++'),'age':23}]
>>> data
[{'name': 'rocky', 'like': ('python', 'c++'), 'age': 23}]
>>> data_json = json.dumps(data)
>>> data_json
'[{"name": "rocky", "like": ["python", "c++"], "age": 23}]'
encoding 的操作比較簡單,請仔細觀察一下上面代碼中 data 和 data_json 的不同:like 的值從元組變成了列表,其實還有不同,請看下面:
>>> type(data)
<class 'list'>
>>> type(data_json)
<class 'str'>
2.decoding:loads()
decoding 的過程其實也像上面那麼簡單:
>>> new_data = json.loads(data_json)
>>> new_data
[{'name': 'rocky', 'like': ['python', 'c++'], 'age': 23}]
上面需要注意的是,解碼之後並沒有將值中的列表還原為數組。上面的 data 都不是很長,還能湊活著看,如何很長,閱讀其實就很有難度了。所以 JSON 的 dumps() 提供了可選的參數,利用它們能在輸入上對人更好,當然這個對機器來說都是無所謂的事情。
>>> data1 = json.dumps(data,sort_keys = True,indent = 2)
>>> print(data1)
[
{
"age": 23,
"like": [
"python",
"c++"
],
"name": "rocky"
}
]
sort_keys = True 的意思是按照鍵的字典順序排序;indent = 2 則是讓每個鍵值對顯示的時候,以縮進兩個字符對齊,這樣的視覺效果就好多了。
大 JSON 字符串
其實如果數據不是很大的話,上面的那些基本操作就足夠了。但現在不是都講究什麼都是「大數據」嘛,很多人都在吹噓自己是大數據,顯然不能讓 JSON 總是很小。
事實上對於真正的大數據,再大的 JSON 也不夠,前面的操作方法是將數據都讀入內存,如果數據太大的話就會溢出。那麼這個時候該怎麼辦呢?別怕,我們是 Python 啊,早都想到了,Python 中提供了一個 tempfile 的模塊解決此類問題。這裡需要注意的是,跟上面已經用過的函數相比是不同的,請仔細觀察。
>>> import tempfile
>>> data = [{'name':'rocky','like':('python','c++'),'age':23}]
>>> f = tempfile.NamedTemporaryFile(mode = 'w+')
>>> json.dump(data,f)
>>> f.flush()
>>> print(open(f.name,'r').read())
[{"name": "rocky", "like": ["python", "c++"], "age": 23}]
寫在之後
差不多 JSON 就是這些內容了,是不是比起 XML 真的少了很多,也簡單了很多?但是簡單歸簡單,內容還是不能小覷的,上面的代碼例子什麼的,該看看,該在交互模式自己敲一敲就敲一敲,切勿眼高手低。
如果你覺得本篇文章對你有幫助的話,歡迎點讚,如果你有什麼問題的話,歡迎在後臺或者加微信聯繫我。
The end。