Python查询对象不可序列化
当我尝试对查询对象进行编码时,出现以下错误:Python查询对象不可序列化,python,json,google-app-engine,serialization,jinja2,Python,Json,Google App Engine,Serialization,Jinja2,当我尝试对查询对象进行编码时,出现以下错误: File "C:\Program File\Python27\lib\json\encoder.py", line 264, in iterencode return _iterencode(o, 0) File "C:\Program File\Python27\lib\json\encoder.py", line 178, in default raise TypeError(repr(o) + "
File "C:\Program File\Python27\lib\json\encoder.py", line 264, in iterencode
return _iterencode(o, 0)
File "C:\Program File\Python27\lib\json\encoder.py", line 178, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: ActivitySummaries(key=Key('ActivitySummaries', 634), activated_users=0, broker_approved=0, broker_registered=0, broker_searched=1, closed_deals=0, company_registered=0, company_searched=4, deal_appoved=0, investor_approved=0, investor_registered=0, investor_searched=3, registered_users=0, timestamp=datetime.datetime(2013, 4, 8, 20, 41, 47, 574000), watchlisting=0) is not JSON serializable
jquery:
$.ajax({
data: someData,
url: someUrl,
type: 'POST',
dataType: 'json',
success: function(data)
{
alert("Success");
},
error : function(request, status, thrownError){
alert("Error");
return;
}
});
处理程序:
search_pattern = roledb.ActivitySummaries.searchPatterns(start_date, end_date)
self.response.write(json.dumps(search_pattern))
roledb.py
class ActivitySummaries(ndb.Model):
def searchPatterns(cls, start_date, end_date):
activities = cls.query()
results = []
for activity in activities:
if ( activity.timestamp >= start_date and activity.timestamp <= end_date ):
results.append(activity)
return results
我是谷歌应用程序引擎的新手,我不知道为什么它不能使用JSON进行序列化
任何输入都将受到衷心感谢。您只能在Python中序列化简单的数据类型,如字典、数组等。因此,您不应该序列化查询对象,而应该序列化此查询的结果—我想它将是一个数组 另一个解决方案是使用子类来处理任意值,就像我为DateTime编写的代码片段一样:
import datetime
from json import JSONEncoder
class DateEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.date):
return obj.isoformat()
return JSONEncoder.default(self, obj)
要使用它,请指定cls=DateEncoder:
在Python中,您只能序列化简单的数据类型,如字典、数组等。因此,您不应该序列化查询对象,而应该序列化此查询的结果—我猜它将是一个数组 另一个解决方案是使用子类来处理任意值,就像我为DateTime编写的代码片段一样:
import datetime
from json import JSONEncoder
class DateEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.date):
return obj.isoformat()
return JSONEncoder.default(self, obj)
要使用它,请指定cls=DateEncoder:
您几乎可以序列化任何想要使用JSON的内容,但除了简单的结构之外,您还需要自己完成。写下你自己的解封信 但是在您的情况下,我怀疑序列化查询对象是否有意义。你会在另一端用它做什么?Javascript对此无能为力,如果您只想传递查询参数,那么只需传递这些参数,而不是查询对象 也许您实际上想要序列化查询的结果集并将其传递回客户端。在这种情况下,执行一个fetch,或者使用一个游标来检索结果块 Model基类有一个to_dict方法,这是您通常调用的方法,然后您将序列化字典
result = json.dumps([dumps(i.to_dict()) for i in query.fetch(100))
或者更好地使用查询的map方法,甚至还有一个map\u async
def dump(obj):
return json.dumps(obj.to_dict())
result = query.map(dump)
看
您需要将这一点与另一个答案结合起来,为日期和任何其他非简单数据类型提供一个自定义编码器。您可以序列化您想要JSON的几乎任何内容,但除了简单的结构之外,您还需要自己完成。写下你自己的解封信 但是在您的情况下,我怀疑序列化查询对象是否有意义。你会在另一端用它做什么?Javascript对此无能为力,如果您只想传递查询参数,那么只需传递这些参数,而不是查询对象 也许您实际上想要序列化查询的结果集并将其传递回客户端。在这种情况下,执行一个fetch,或者使用一个游标来检索结果块 Model基类有一个to_dict方法,这是您通常调用的方法,然后您将序列化字典
result = json.dumps([dumps(i.to_dict()) for i in query.fetch(100))
或者更好地使用查询的map方法,甚至还有一个map\u async
def dump(obj):
return json.dumps(obj.to_dict())
result = query.map(dump)
看
您需要将这一点与另一个答案结合起来,为日期和任何其他非简单数据类型提供自定义编码器。我发现以下解决方案适用于将包含ndb.DateTimeProperty的ndb.Model对象序列化为子对象
from datetime import datetime
import json
from google.appengine.ext import ndb
__author__ = 'achuinard'
class GaeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return int(obj.strftime('%s'))
elif isinstance(obj, ndb.Model):
return obj.to_dict()
else:
return json.JSONEncoder.default(self, obj)
def serialize(object_to_serialize):
return json.dumps(object_to_serialize, cls=GaeEncoder)
我发现以下解决方案可用于将包含ndb.DateTimeProperty的ndb.Model对象序列化为子对象
from datetime import datetime
import json
from google.appengine.ext import ndb
__author__ = 'achuinard'
class GaeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return int(obj.strftime('%s'))
elif isinstance(obj, ndb.Model):
return obj.to_dict()
else:
return json.JSONEncoder.default(self, obj)
def serialize(object_to_serialize):
return json.dumps(object_to_serialize, cls=GaeEncoder)
你能给我举一个例子说明如何使用todict方法吗?你能给我举一个例子说明如何使用todict方法吗?