【问题标题】:How to serialize the result of a query in python?如何在python中序列化查询的结果?
【发布时间】:2013-05-16 20:59:27
【问题描述】:

我无法从查询中序列化结果数组,其中一个投影是 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”。

【问题讨论】:

标签: json google-app-engine serialization python-2.7


【解决方案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='。

【讨论】:

  • 我在使用这个时得到一个“ValueError: Circular reference detected”。知道为什么吗?
猜你喜欢
  • 2016-01-04
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2017-03-18
  • 2015-02-03
  • 1970-01-01
  • 2012-06-12
  • 2017-11-16
相关资源
最近更新 更多