Python查询对象不是serializab

2024-09-29 18:44:33 发布

您现在位置:Python中文网/ 问答频道 /正文

当我试图对查询对象进行编码时,出现以下错误:

  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

查询:

^{pr2}$

经办人:

 search_pattern = roledb.ActivitySummaries.searchPatterns(start_date, end_date)

            self.response.write(json.dumps(search_pattern))

在角色扮演者在

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

我是googleappengine的新手,我不知道为什么它不能使用JSON序列化。在

如有任何意见,我们将不胜感激。在


Tags: injsondateinvestorbrokeractivitystartresults
3条回答

在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

^{pr2}$

您几乎可以序列化任何您想要的JSON,但除了简单的结构之外,您还需要自己完成。写下你自己的解嘲者。在

但是在您的例子中,我怀疑序列化查询对象是否有意义。在另一端你会怎么处理?Javascript不能用它做任何事情,如果您只想传递查询参数,那么只需传递这些参数而不是一个查询对象。在

也许您实际上想要序列化查询的结果集并将其传递回客户机。在这种情况下,执行一个fetch,或者使用一个游标来检索结果块。在

在ndb.型号基类有一个to_dict()方法,这是您通常调用的方法,然后将字典序列化。在

result = json.dumps([dumps(i.to_dict()) for i in query.fetch(100)) 

或者更好地使用map查询方法(甚至还有一个map_async)

^{pr2}$

https://developers.google.com/appengine/docs/python/ndb/queries#map

为您提供一个简单的日期和其他类型的答案将与其他简单的日期组合起来。在

我发现以下解决方案可以将包含ndb.DateTimePropertyndb.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)

相关问题 更多 >

    热门问题