使用Python将Google App Engine数据存储查询为JSON

使用Python将Google App Engine数据存储查询为JSON,python,json,google-cloud-datastore,Python,Json,Google Cloud Datastore,如何通过GoogleAppEngine数据存储获取python中的JSON对象 我在数据存储中得到了具有以下字段的模型: id key_name object userid created 现在我想为一个用户获取所有对象: query = Model.all().filter('userid', user.user_id()) 如何从查询中创建JSON对象以便编写它 我想通过AJAX调用获取数据。如果我理解正确,我已经实现了一个类似这样的系统。听起来您想在GAE数据存储模型中存储任意JSON

如何通过GoogleAppEngine数据存储获取python中的JSON对象

我在数据存储中得到了具有以下字段的模型:

id
key_name
object
userid
created
现在我想为一个用户获取所有对象:

query = Model.all().filter('userid', user.user_id())
如何从查询中创建JSON对象以便编写它


我想通过AJAX调用获取数据。

如果我理解正确,我已经实现了一个类似这样的系统。听起来您想在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()

(未经测试)。请参阅,以了解一些这样工作的模型实现

不确定是否得到了想要的答案,但您的意思是如何将查询对象中的模型(条目)数据直接解析为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'}, ...]

让我知道这是否有帮助

我做了以下操作来将google query对象转换为json。我也使用了上面jql_json_解析器中的逻辑,除了将所有内容转换为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_对象上调用self.to_json