使用Python将Google App Engine数据存储查询为JSON
如何通过GoogleAppEngine数据存储获取python中的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
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