基於JSON的數據服務與應用-推薦範式

原創內容,親自調試,歡迎分享,敬請引用:    http://my.oschina.net/u/2306127/blog/600005python

隨着大數據概念的深刻人心,面向API的數據服務正成爲趨勢,而輸出JSON是目前的主流技術模式。這裏提出了一種數據描述河應用範式,能夠更加方便數據傳輸和數據共享。shell

輸出的JSON格式

{
"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

數據抓取轉爲Table

由於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

相關文章
相關標籤/搜索