在介紹使用Python處理JSON數據的基本方法之前,我們首先要了解壹下什麽是JSON?
JSON代表“JavaScript Object Notation”,可以說是“基於JavaScript語言符號的數據格式”。但是,該表示法僅基於JavaScript,可用於其他各種語言。
JSON是我們存儲和交換數據的壹種方式,它通過其語法實現,並在許多Web應用程序中使用。JSON的優點在於它具有人類可讀的格式,這可能是在數據傳輸中使用它的原因之壹,此外還有使用API時的有效性。
在JSON中,數據以名稱/值(name/value)對表示;大括號內存儲對象,每個名稱後跟':'(冒號),名稱/值對之間要用(逗號)分隔;方括號包含數組,值以(逗號)分隔。
JSON格式數據的示例:
{
"book1":{
"title": "Python Beginners",
"year": 2005 ,
"page": 399
},
"book2":{
"title": "Python Developers",
"year": 2006 ,
"page": 650
}
}下面我們來詳細了解壹下在Python中如何處理JSON數據。
Python使得處理JSON數據變得簡單。實現此目的的模塊是json模塊。該模塊應該包含在Python(內置)安裝中,因此妳不需要像使用PDF和Excel文件那樣安裝任何外部模塊。要使用此模塊,妳唯壹需要的是導入它(開頭寫入):
import json但是,JSON庫是做什麽的呢?此庫主要從文件或字符串解析JSON。它還將JSON解析為Python中的字典或列表,反之亦然,即將Python字典或列表轉換為JSON字符串。
讀取JSON(JSON轉Python)
讀JSON意味著將JSON轉換為Python值(對象)。如上所述,json庫將JSON解析為Python中的字典或列表。為此,我們使用loads()函數(從字符串加載),如下所示:
import json
jsonData = '{"name": "Frank", "age": 39}'
jsonToPython = json.loads(jsonData)如果要查看輸出,請執行 print jsonToPython,在這種情況下,妳將獲得以下輸出:
{'age': 39, 'name': 'Frank'}也就是說,數據作為Python字典(JSON對象數據結構)返回。
Python轉JSON
上壹節我們介紹了JSON轉Python,這壹節我們將向妳展示如何將Python值轉換(編碼)為JSON。
假設我們在Python中有以下字典:
import json
pythonDictionary = {'name':'Bob', 'age':44, 'isEmployed':True}
dictionaryToJson = json.dumps(pythonDictionary)如果我們運行 print dictionaryToJson,我們得到以下JSON數據:
{"age": 44, "isEmployed": true, "name": "Bob"}因此,此輸出被視為對象(Dictionary)的數據表示。該方法dumps()是此類操作的關鍵。
此時需要註意的是,JSON不能存儲所有類型的Python對象,只能存儲以下類型:列表; 字典; 布爾值; 數; 字符串; 沒有。因此,需要轉換任何其他類型以便存儲在JSON中。
假設我們有以下課程:
class Employee(object):
def __init__(self, name):
self.name = name假設我們創建了壹個新對象abder,如下所示:
abder = Employee('Abder')如果我們想將此對象轉換為JSON,該怎麽辦?那是json.dumps(abder)?在這種情況下,妳將收到類似於以下內容的錯誤:
Traceback (most recent call last):
File "test.py", line 8, in <module>
abderJson = json.dumps(abder)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 243, in dumps
return _default_encoder.encode(obj)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 184, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <__main__.Employee object at 0x10e74b750> is not JSON serializable但是,有解決方法嗎?幸運的是有。要解決此問題,我們可以定義類似於以下的方法:
def jsonDefault(object):
return object.__dict__然後將對象編碼為JSON,如下所示:
jsonAbder = json.dumps(abder, default=jsonDefault)如果妳運行 print jsonAbder,妳應該得到以下輸出:
{"name": "Abder"}我們現在已經將Python對象(abder)編碼為JSON。