1

プロジェクションの 1 つが 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() を使用して、この特定のインスタンスをシリアル化するのを手伝ってくれる人はいますか。必要に応じて、コードの詳細を提供できます。

PS : 私のプロジェクトは "Django" または "simplejson" を使用していません。

4

1 に答える 1

1

他の多くのオプション。http://blog.codevariety.com/2012/01/06/python-serializing-dates-datetime-datetime-into-json/からのそれらの 1 つ:

def date_handler(obj):
    return obj.isoformat() if hasattr(obj, 'isoformat') else obj

print json.dumps(data, default=date_handler)

あなたの例では、「cls =」の代わりに「default =」を使用する必要があることに注意してください。

于 2013-05-22T05:27:33.023 に答える