Python查询对象不可序列化

New*_*bie 1 python google-app-engine serialization json 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) + " 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
Run Code Online (Sandbox Code Playgroud)

jQuery的:

$.ajax({
        data: someData,
        url: someUrl,
        type: 'POST',
        dataType: 'json',
        success: function(data)
        {
            alert("Success");
        },
        error : function(request, status, thrownError){
            alert("Error");
            return;
                }
    });
Run Code Online (Sandbox Code Playgroud)

处理器:

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

            self.response.write(json.dumps(search_pattern))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我是Google App Engine的新手,我不知道为什么它不能使用JSON进行序列化.

任何投入都将非常感激.

Den*_*sky 7

您可以在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)
Run Code Online (Sandbox Code Playgroud)

并使用它指定cls=DateEncoder:

json.dumps(data, cls=DateEncoder)
Run Code Online (Sandbox Code Playgroud)