我无法从查询中序列化结果数组,其中一个投影是datetime属性。
我的模型类如下所示:
class ActivitySummaries(ndb.Model):
registered_users = ndb.IntegerProperty()
activated_users = ndb.IntegerProperty()
company_registered = ndb.IntegerProperty()
broker_registered = ndb.IntegerProperty()
investor_registered = ndb.IntegerProperty()
deal_approved = ndb.IntegerProperty()
broker_approved = ndb.IntegerProperty()
investor_approved = ndb.IntegerProperty()
company_searched = ndb.IntegerProperty()
broker_searched = ndb.IntegerProperty()
investor_searched = ndb.IntegerProperty()
watchlisting = ndb.IntegerProperty()
closed_deals = ndb.IntegerProperty()
timestamp = ndb.DateTimeProperty(auto_now_add=True)
Query:
activities = cls.query()
我希望使用JSON从Python以序列化形式发送查询的结果数组,并使用JSON在JavaScript中反序列化。
我收到以下错误:
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: ActivitySummaries(key=Key('ActivitySummaries', 923), activated_users=0, broker_approved=0, broker_registered=0, broker_searched=1, closed_deals=0, company_registered=0, company_searched=1, deal_approved=0, investor_approved=0, investor_registered=0, investor_searched=0, registered_users=0, timestamp=datetime.datetime(2013, 5, 21, 22, 14, 28, 48000), watchlisting=0) is not JSON serializable
所以我尝试使用子类来处理任意值,如下所示:
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)
并使用json.dumps(data, cls=DateEncoder)
但我仍然得到同样的错误。
我已经读过某个地方,NDB类有to_dict()内置的方法,我们通常会调用它,然后序列化字典。任何人都可以使用to_dict()帮助我为这个特定实例序列化。如有必要,我可以为您提供更多代码详细信息。
P.S:我的项目没有使用“Django”或“simplejson”。
答案 0 :(得分:1)
其他地方有很多选择。其中之一,来自http://blog.codevariety.com/2012/01/06/python-serializing-dates-datetime-datetime-into-json/:
def date_handler(obj):
return obj.isoformat() if hasattr(obj, 'isoformat') else obj
print json.dumps(data, default=date_handler)
请注意,与您的示例相比,您应该使用'default ='而不是'cls ='。