53

jsonシリアル化が日時オブジェクトに対して機能しないのはなぜですか。私が理解しているように、jsonのシリアル化では、オブジェクトの基本的な考え方は、 __str__組み込み関数を呼び出してから、応答として取得したオブジェクトをurlencodeすることです。しかし、日時の場合、次のエラーが発生します

TypeError: datetime.datetime(2012, 5, 23, 18, 38, 23, 37566) is not JSON serializable

すでに利用可能なオブジェクトを文字列化する方法があり__str__ますが、それを行わないという意識的な決定のようですが、なぜそうなるのでしょうか。

4

4 に答える 4

91

jsonいいえ、モジュールではそのようには機能しません。モジュールは、デフォルトのエンコーダーを提供します: json.JSONEncoder. defaultオブジェクトをシリアル化するメソッドの実装を提供するには、これを拡張する必要があります。このようなもの:

import json
import datetime
from time import mktime

class MyEncoder(json.JSONEncoder):

    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return int(mktime(obj.timetuple()))

        return json.JSONEncoder.default(self, obj)

print json.dumps(obj, cls=MyEncoder)

他の人が正しく指摘したように、その理由は、json の標準が日時の表現方法を指定していないためです。

于 2012-05-23T14:01:05.543 に答える
10

それらをどのようにシリアル化しますか?

JSON では日付の処理方法が指定されていないため、Pythonjsonライブラリは日付を表す方法を決定できません。それは、反対側 (ブラウザー、スクリプトなど) が JSON の日付をどのように処理するかに完全に依存します。

于 2012-05-23T13:57:00.117 に答える
8

シリアライゼーションが日時をサポートするように json モジュールにパッチを当てる簡単な方法。

import json
import datetime

json.JSONEncoder.default = lambda self,obj: (obj.isoformat() if isinstance(obj, datetime.datetime) else None)

いつものようにjsonシリアライゼーションを使用するよりも、今回はdatetimeをアイソフォーマットとしてシリアライズします。

json.dumps({'created':datetime.datetime.now()})

結果: '{"created": "2015-08-26T14:21:31.853855"}'

詳細と注意事項については、 StackOverflow: JSON datetime between Python and JavaScriptを参照してください。

于 2015-08-26T11:31:37.160 に答える