当我尝试对查询对象进行编码时,出现以下错误:
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
j查询:
$.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
我是 Google App Engine 的新手,我不知道为什么它不能使用 JSON 进行序列化。
我们将不胜感激任何意见。
最佳答案
您只能在 Python 中序列化“简单”数据类型,例如字典、数组等。因此您不应序列化查询对象,而应序列化此查询的结果——我猜它会是一个数组。
另一种解决方案是子类化 JSONEncoder处理任意值,就像我为 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.dumps(data, cls=DateEncoder)
关于Python 查询对象不可序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16351286/