JSON(表示“JavaScript對象表示法”)是一種基於文本的格式,它促進了不同應用程序之間的數據交換。例如,在Windows上運行的C++編寫的應用程序可以輕鬆地將JSON數據與應用於Python的應用程序進行運行,並在Linux上運行。它的簡單性和靈活性近年來得到了廣泛的應用,特別是在更傾向於早期基於XML的格式方面。
有一些庫和工具箱可用於從幾乎任何語言和環境中解析和生成JSON。本文主要討論使用python處理JSON時產生的方法和問題。
您將遇到的最常見的JSON實體是一個對象:一組鍵值映射,格式如下所示。
個人.json:
{ "firstName": "Alice", "lastName": "Hall", "age": 35}下面是如何表示對象數組。在這種表示法中,數組的每一項都是一個對象。以下是棒球運動員的工資樣本。
工資.json:
[ { "year" : 1985, "teamId" : "ATL", "leagueId" : "NL", "playerId" : "barkele01", "salary" : 870000}, { "year" : 1985, "teamId" : "ATL", "leagueId" : "NL", "playerId" : "bedrost01", "salary" : 550000} ]當然,也可以表示標量數組。看起來是這樣的:
[ "hello", "world", 35]Python提供了json模塊,可以用來解析json,也可以從Python對象和列表生成json。
下面的代碼片段演示如何打開JSON文件並將數據加載到變量中。
import jsonwith open('sample.json', 'r') as fp: obj = json.load(fp)當您有一個包含JSON數據的字符串時,可以使用以下命令將其轉換為python對象(或列表):
obj = json.loads("""{ "firstName": "Alice", "lastName": "Hall", "age": 35}""")要解析JSON URL,可以使用urllib2創建URL對象並使用json.load文件()和以前一樣。
import urllib2, jsonurl = urllib2.urlopen('http://site.com/sample.json')obj = json.load(url)當JSON有錯誤時,您將得到ValueError。你可以處理它,並採取糾正措施,如果需要的話。
try: obj = json.loads("""{ "firstName": "Alice", "lastName: "Hall", "age": 35 }""")except ValueError: print "error loading JSON"有時,使用python命令行解析JSON很有用,可能是為了檢查錯誤或獲得良好的縮進輸出。
cat glossary.json# prints{"glossary": {"GlossDiv": {"GlossList": {"GlossEntry": {"GlossDef": {"GlossSeeAlso": ["GML", "XML"], "para": "A meta-markup language, used to create markup languages such as DocBook."}, "GlossSee": "markup", "Acronym": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Abbrev": "ISO 8879:1986", "SortAs": "SGML", "ID": "SGML"}}, "title": "S"}, "title": "example glossary"}}要從上述JSON文件獲得縮進輸出,可以執行以下操作:
python -mjson.tool glossary.json# prints{ "glossary": { "GlossDiv": { "GlossList": { "GlossEntry": { "Abbrev": "ISO 8879:1986", "Acronym": "SGML", "GlossDef": { "GlossSeeAlso": [ "GML", "XML" ], "para": "A meta-markup language, used to create markup languages such as DocBook." }, "GlossSee": "markup", "GlossTerm": "Standard Generalized Markup Language", "ID": "SGML", "SortAs": "SGML" } }, "title": "S" }, "title": "example glossary" }}下面是如何將JSON對象加載到python中並只提取所需內容。
python -c 'import json; fp = open("glossary.json", "r"); obj = json.load(fp); fp.close(); print obj["glossary"]["title"]'# printsexample glossary一旦將JSON數據加載到python變量中,就可以像訪問任何python dict(或列表,視情況而定)一樣訪問數據。例如,可以按如下方式訪問上述JSON數據:
firstName = obj["firstName"]lastName = obj["Hall"]age = obj["age"]數據類型是根據數據自動確定的。注意,age被解析為整數。
print type(obj["firstName"]), type(obj["lastName"]), type(obj["age"])# prints<type 'unicode'> <type 'unicode'> <type 'int'>下面的轉換表用於從JSON轉換為python。
默認情況下,JSON對象被解析為python dict。有時您可能需要從JSON數據自動創建自己類的對象。您可以通過指定處理轉換的object\u hook函數來實現這一點。下面的示例演示如何。
這是一個表示個人的自定義類。
class Person: def __init__(self, firstName, lastName, age): self.firstName = firstName self.lastName = lastName self.age = age def __str__(self): return '{{"firstName" = "{0}","lastName" = "{1}", "age" = {2}}}'.format(self.firstName, self.lastName, self.age)通過傳遞所需的參數來創建此類的實例,如下所示:
person = Person("Crystal", "Newell", 27)要在解析JSON時使用這個類來創建實例,需要一個object\u hook函數,定義如下:該函數接收python dict並返回正確類的對象。
def obj_creator(d): return Person(d['firstName'], d['lastName'], d['age'])現在可以在調用JSON解析器時使用這個object\u hook函數。
with open('sample.json', 'r') as fp: obj = json.load(fp, object_hook = obj_creator)print obj# prints{"firstName" = "Alice","lastName" = "Hall", "age" = 35}JSON現在非常流行。許多網站和SaaS(軟件即服務)應用程序提供JSON輸出,應用程序可以直接使用這些輸出。一些公開的信息包括:
如果您正在尋找更多關於如何更好地使用它的示例,請查看這個使用Python構建社交媒體bot的指南。
您是使用JSON來消費還是提供服務?您在技術堆棧中使用python嗎?請在下面的評論中解釋。
...寸點數”)是Windows中的一種縮放功能,旨在使介面在高解析度顯示器上更具可讀性,否則文字和按鈕對於日常使用來說就太小了。但是你甚至可以在更小的螢幕上使用它! ...
...16:9,以避免裁剪。如果有人從活動頁面點選,全高畫質解析度的影象也會給你的封面帶來足夠的清晰度。您可以隨意使用更高的解析度來填充畫素。 ...
...如,一個簡單的23.8英寸巨集碁顯示器可以給你清晰的1080p解析度在生動的色彩。 ...
... 首先,顯示器的解析度非常重要。還記得DPI如何將滑鼠游標移動到每英寸畫素的設定值嗎?這意味著,如果設定為相同的DPI,但使用更大的解析度,滑鼠會感覺不一樣。那是因為有更多的...
...尋詞的末尾加上“wallpaper”,但這樣可以更容易地縮小高解析度和正確縱橫比的影象範圍。 即使這樣,你也可能想進一步縮小範圍,特別是如果你有QHD或4K顯示器的話。當你用Google圖片搜尋桌布時,你會發現1920×1080的圖片佔據...
PC遊戲的理想解析度是什麼?問大多數玩家,他們會立即回答,“不管你的顯示器能支援什麼。”這是顯而易見的解決方案,畢竟,以高於你的裝置實際輸出和你的眼睛能看到的高度渲染圖形是沒有意義的,對嗎?…對吧? 超...