原創內容,親自調試,歡迎分享,敬請引用: http://my.oschina.net/u/2306127/blog/600005python
隨着大數據概念的深刻人心,面向API的數據服務正成爲趨勢,而輸出JSON是目前的主流技術模式。這裏提出了一種數據描述河應用範式,能夠更加方便數據傳輸和數據共享。shell
{ "about":"this is a simple data", "author":"openthings@163.com", "copyright":"gpl", "source":"http://my.oschina.net/u/2306127/blog/600005", "result":"return_code", "data":[ {"name":"nameaaa","file":"fileaaa","baseurl":"baseurl","token":"tokenaaa","api":"apiaaa"}, {"name":"namebbb","file":"filebbb","baseurl":"baseurl","token":"tokenbbb","api":"apibbb"}, {"name":"nameccc","file":"fileccc","baseurl":"baseurl","token":"tokenccc","api":"apiccc"} ]}
全部的數據都存於data段中,能夠經過s['data']快速訪問到這個數值。django
關於數據目錄的信息也採用上述一致的方式,以方便用一樣的方式和代碼進行快速處理。
json
數據能夠來自於文件,或者網絡。若是被嵌入到網頁中,可能還須要更多的提取方法。
api
以Python爲例,將上面的信息保存文件爲"json.txt"。
網絡
# -*- coding: utf-8 -*- #"author":"openthings@163.com", #"copyright":"gpl", #"source":"http://my.oschina.net/u/2306127/blog/600005" import json import codecs #使用codecs以讓其能夠處理中文等字符集。 f = codecs.open("json.txt", 'r','utf-8') s = f.read() f.close() #顯示文件的全部信息。 print("File:=====================") print(s) #顯示載入後的全部信息,部分字段會被從新排序。 print("JSON:=====================") j = json.loads(s) print(j) #顯示文件中的Data段的信息。 print("DATA:=====================") data = j["data"] #這是提取data的全部記錄的方法,被存到一個dict類裏面。 print(data) #顯示data的全部行(相似於數據表的記錄)。 for row in data: print("ROW=====================") print(row) print("Key,Value=====================") for key in row: print(str(key),row[str(key)])
將上面內容拷貝到文件jtest.py,而後運行,就能夠看到被json解析後的結果:大數據
python jtest.py
由於json不可以被數據處理軟件直接分析,咱們再將其轉換爲一個Table,這裏的格式能夠在Orange中直接載入,也能夠在Excel之類的軟件中直接使用(導入時,採用Tab分隔符)。
this
# -*- coding: utf-8 -*- #"author":"openthings@163.com", #"copyright":"gpl", #"source":"http://my.oschina.net/u/2306127/blog/600005" import json import codecs import requests #得到字段的值,檢查該key是否存在,不然以‘-’替代. def getvalue(row,rowkey): if row.has_key(rowkey): #print(rowkey) str_val=u"%s"%row[str(rowkey)] else: str_val = u"-" return str_val #獲得一行(row)的tab方式的表示. def getrow(row,keys): str_row = "" print("-----------------") for key in keys: #print("Key: "+str(key)) str_row = str_row + getvalue(row,str(key)) + "\t" print(str_row) return str_row #將獲取和解析到的數據保存到tab文件中。 def savetab(result,fname): js=json.loads(result) jsdata = js['data'] file_object = codecs.open(fname, 'w','utf-8') keys = jsdata[0].keys() strdata="" for key in keys: strdata = strdata + key + "\t" strdata = strdata + "\n" file_object.write(strdata) strdata="" for key in keys: strdata = strdata + "d\t" strdata = strdata + "\n" file_object.write(strdata) strdata="" for key in keys: strdata = strdata + " \t" strdata = strdata + "\n" file_object.write(strdata) for row in jsdata: try: str_row = getrow(row,keys)+"\n" file_object.write(str_row) except Exception, e: print e continue file_object.close() #保存數據到Tab格式,能夠在Orange直接載入. def getdatatab(fname): try: data_url = "..." #這裏填入RESTfull Webservice的URL,或者從文件中載入。 f = codecs.open("json.txt", 'r','utf-8') str_data = f.read() f.close() str_data = requests.get(data_url) savetab(result,fname) except Exception, e: print(e) #運行之... if __name__ == '__main__': getdatatab('jsondata.tab')
能夠考慮使用OpenResty來作這個服務,用django也很easy。很快就能夠創建一個RESTfull的Web服務,而後輸出JSON格式的數據,客戶端採用上面的代碼,很容易解析並轉換爲須要的格式,若是開發一個插件到其它軟件,就能夠直接導入了。
url