2011-03-21 88 views
2

我怎樣才能獲得通過谷歌App Engine數據存儲獲取數據的Python中的JSON對象?谷歌應用程序引擎數據存儲查詢與Python的JSON

我有模型,數據存儲與以下領域:

id 
key_name 
object 
userid 
created 

現在我想獲得的所有對象爲一個用戶:

query = Model.all().filter('userid', user.user_id()) 

如何從查詢中創建一個JSON對象這樣我可以寫嗎?

我想通過AJAX調用獲取數據。

回答

1

如果我正確理解你,我已經實現了一個這樣的系統。聽起來你想要在GAE數據存儲模型中存儲任意的JSON對象。要做到這一點,你需要在進入數據庫的過程中將JSON編碼爲某種類型的字符串,並在出路時將其從字符串解碼爲Python數據結構。您將需要使用JSON編碼器/解碼器來執行此操作。我認爲GAE基礎設施包括一個。例如,您可以使用「包裝類」來處理編碼/解碼。這些方針的東西...

class InnerClass(db.Model): 
    jsonText = db.TextProperty() 
    def parse(self): 
     return OuterClass(self) 

class Wrapper: 
    def __init__(self, storage=None): 
     self.storage = storage 
     self.json = None 
     if storage is not None: 
      self.json = fromJsonString(storage.jsonText) 
    def put(self): 
     jsonText = ToJsonString(self.json) 
     if self.storage is None: 
      self.storage = InnerClass() 
     self.storage.jsonText = jsonText 
     self.storage.put() 

然後總是在解析的包裝對象,而不是內部類

def getall(): 
    all = db.GqlQuery("SELECT * FROM InnerClass") 
    for x in all: 
     yield x.parse() 

(未經測試)工作。對於像這樣工作的某些模型實現,請參閱datastoreview.py

7

不確定你是否得到了你正在尋找的答案,但是你的意思是如何將Query對象中的模型(條目)數據直接解析爲JSON對象? (至少這是我一直在尋找的)。

我寫這從查詢對象的條目解析成JSON對象的列表:

def gql_json_parser(query_obj): 
    result = [] 
    for entry in query_obj: 
     result.append(dict([(p, unicode(getattr(entry, p))) for p in entry.properties()])) 
    return result 

你可以有你的應用程序通過simplejson如編碼它響應AJAX請求:

query_data = MyModel.all() 
json_query_data = gql_json_parser(query_data) 
self.response.headers['Content-Type'] = 'application/json' 
self.response.out.write(simplejson.dumps(json_query_data)) 

您的應用將會返回如下內容:

[{'property1': 'value1', 'property2': 'value2'}, ...] 

讓我知道這是否有幫助!

0

我做了以下轉換谷歌查詢對象爲json。我在上面的jql_json_parser中使用了邏輯,除了一切都轉換爲unicode的部分。我想保留像integer,float和null這樣的數據類型。

import json 
class JSONEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if hasattr(obj, 'isoformat'): #handles both date and datetime objects 
      return obj.isoformat() 
     else: 
      return json.JSONEncoder.default(self, obj) 

class BaseResource(webapp2.RequestHandler): 
    def to_json(self, gql_object): 
     result = [] 
     for item in gql_object: 
      result.append(dict([(p, getattr(item, p)) for p in item.properties()])) 
     return json.dumps(result, cls=JSONEncoder) 

現在你也可以繼承BaseResource並呼籲gql_object self.to_json

相關問題