JSON,全稱爲JavaScript Object Notation, 也就是JavaScript對象標記,它經過對象和數組的組合來表示數據,構造簡潔可是結構化程度很是高,是一種輕量級的數據交換格式。本節中,咱們就來了解如何利用Python保存數據到JSON文件。javascript
在JavaScript語言中,一切都是對象。所以,任何支持的類型均可以經過JSON來表示,例如字符串、數字、對象、數組等,可是對象和數組是比較特殊且經常使用的兩種類型,下面簡要介紹一下它們。java
{}
包裹起來的內容,數據結構爲{key1:value1, key2:value2, ...}
的鍵值對結構。在面向對象的語言中,key
爲對象的屬性,value
爲對應的值。鍵名可使用整數和字符串來表示。值的類型能夠是任意類型。[]
包裹起來的內容,數據結構爲["java", "javascript", "vb", ...]
的索引結構。在JavaScript中,數組是一種比較特殊的數據類型,它也能夠像對象那樣使用鍵值對,但仍是索引用得多。一樣,值的類型能夠是任意類型。因此,一個JSON對象能夠寫爲以下形式:json
[{ "name": "Bob", "gender": "male", "birthday": "1992-10-18" }, { "name": "Selina", "gender": "female", "birthday": "1995-10-18" }]
由中括號包圍的就至關於列表類型,列表中的每一個元素能夠是任意類型,這個示例中它是字典類型,由大括號包圍。數組
JSON能夠由以上兩種形式自由組合而成,能夠無限次嵌套,結構清晰,是數據交換的極佳方式。數據結構
Python爲咱們提供了簡單易用的庫來實現JSON文件的讀寫操做,咱們能夠調用庫的loads()
方法將JSON文本字符串轉爲JSON對象,能夠經過dumps()
方法將JSON對象轉爲文本字符串。spa
例如,這裏有一段JSON形式的字符串,它是str
類型,咱們用Python將其轉換爲可操做的數據結構,如列表或字典:code
import json str = ''' [{ "name": "Bob", "gender": "male", "birthday": "1992-10-18" }, { "name": "Selina", "gender": "female", "birthday": "1995-10-18" }] ''' print(type(str)) data = json.loads(str) print(data) print(type(data))
運行結果以下:對象
<class 'str'> [{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}] <class 'list'>
這裏使用loads()
方法將字符串轉爲JSON對象。因爲最外層是中括號,因此最終的類型是列表類型。索引
這樣一來,咱們就能夠用索引來獲取對應的內容了。例如,若是想取第一個元素裏的name
屬性,就可使用以下方式:ip
data[0]['name'] data[0].get('name')
獲得的結果都是:
Bob
經過中括號加0索引,能夠獲得第一個字典元素,而後再調用其鍵名便可獲得相應的鍵值。獲取鍵值時有兩種方式,一種是中括號加鍵名,另外一種是經過get()
方法傳入鍵名。這裏推薦使用get()
方法,這樣若是鍵名不存在,則不會報錯,會返回None
。另外,get()
方法還能夠傳入第二個參數(即默認值),示例以下:
data[0].get('age') data[0].get('age', 25)
運行結果以下:
None 25
這裏咱們嘗試獲取年齡age
,其實在原字典中該鍵名不存在,此時默認會返回None
。若是傳入第二個參數(即默認值),那麼在不存在的狀況下返回該默認值。
值得注意的是,JSON的數據須要用雙引號來包圍,不能使用單引號。例如,若使用以下形式表示,則會出現錯誤:
import json str = ''' [{ 'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18' }] ''' data = json.loads(str)
運行結果以下:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 3 column 5 (char 8)
這裏會出現JSON解析錯誤的提示。這是由於這裏數據用單引號來包圍,請千萬注意JSON字符串的表示須要用雙引號,不然loads()
方法會解析失敗。
若是從JSON文本中讀取內容,例如這裏有一個data.文本文件,其內容是剛纔定義的JSON字符串,咱們能夠先將文本文件內容讀出,而後再利用loads()
方法轉化:
import json with open('data.json', 'r') as file: str = file.read() data = json.loads(str) print(data)
運行結果以下:
[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}]
本節中,咱們瞭解了用Python進行JSON文件讀寫的方法,後面作數據解析時常常會用到,建議熟練掌握。