2012-07-04 22 views
0

我有一個Django數據庫,其中存儲了一些JSON。我想提取這個JSON,解析它,然後對它應用過濾器/查詢。更具體地說,我想有一個動態網頁,顯示按用戶偏好排序,過濾或分組的JSON。是否可以在應用Django數據庫API之前解析json?

從閱讀Django文檔中,我只能看到如何使用預製過濾器(如starts_with),但不知道如何預處理數據。我看到應用正則表達式的選項,但我不認爲我可以手動實現完整的JSON解析器。我目前解析JSON,然後使用python類進行搜索,但這似乎破壞了使用數據庫的目的,特別是因爲它在可處理的查詢類型方面受到限制。

JSON來自其他來源,並且對其字段或結構沒有任何保證。

由於提前,

jhoyla

+0

我猜JSON存儲/檢索爲數據庫中的字符串。所以不存在類似於數據庫的查詢。您可以應用python支持的任何字符串操作。 – Rohan

+0

您可能想要對客戶端進行過濾和排序(即在使用javascript的網頁內)。這減少了你的負載,你只需要把JSON放入網頁。 – rumpel

+0

謝謝,我想知道這是否會更有效,但考慮到目前的數據庫是本地緩存無論如何我認爲不是。您是否認爲試圖從JSON中快速創建表格會起作用? – jhoyla

回答

0

最佳答案我已經能夠拿出是將JSON作爲表添加到數據庫上飛得到的結果的兩個字符串(我做這種方式因爲字典不能保證維持秩序。)

TABLECONFIG = 'data_result' 
def jsontodb(conn, jsonarray): 
    inits = reduce(lambda x, y: x.union(y.keys()), jsonarray, set()) 

conn.execute("CREATE TABLE " + TABLECONFIG + " (" + 
str(map(lambda x: x.encode('UTF-8'), inits)).encode('UTF-8').strip('[]') + ");") 
for i in jsonarray: 
     d = map(lambda y: str(map(lambda x: x.encode('UTF-8'), y)).strip('[]'), zip(*i.items()))  
     conn.execute("INSERT INTO " + TABLECONFIG + " (" + d[0] + ") VALUES (" + d[1] + ");") 
conn.commit() 

DBCONFIG = '/work/django.sqlite3' 
def pullquery(query): 
    p = loads(oqr.main(
     [str(x) for x in shlex.split(query.encode('UTF-8'))] 
    )) 
    conn = sqlite3.connect(DBCONFIG) 
    jsontodb(conn, p) 
    return conn 

給予我想要的結果,但是這隻能如果JSON至多1層深(雖然我猜想這可能是固定它的已經很漂亮了,

相關問題