Skip to main content
 首页 » 编程设计

Python 查询对象不可序列化

2025年05月04日12lexus

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

  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)