2011-03-21 50 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

相关问题