1. ホーム
  2. パイソン

[解決済み】「datetime.datetime not JSON serializable」を克服する方法とは?

2022-03-23 18:35:34

質問

以下のような基本的なdictがあります。

sample = {}
sample['title'] = "String"
sample['somedate'] = somedatetimehere

を行おうとすると jsonify(sample) と出る。

TypeError: datetime.datetime(2012, 8, 8, 21, 46, 24, 862000) is not JSON serializable

私の辞書サンプルが上記のエラーを克服できるようにするには、どうしたらよいでしょうか?

注意してください。 関係ないかもしれないが、辞書は mongodb ここで、プリントアウトすると str(sample['somedate']) という出力になります。 2012-08-08 21:46:24.862000 .

解決方法は?

2018年版アップデート

元の回答は、MongoDBの "date" フィールドの表現方法に対応したものでした。

{"$date": 1506816000000}

Pythonでシリアライズするための汎用的なソリューションが必要な場合 datetime をjsonに変換するには jjmontesの回答 を使えば、依存関係を必要としない迅速な解決策を得ることができます。


あなたはmongoengineを使用しており(コメントによる)、pymongoが依存関係にあるため、pymongoにはjsonシリアライゼーションを支援するための組み込みユーティリティがあります。

http://api.mongodb.org/python/1.10.1/api/bson/json_util.html

使用例(シリアライズ)。

from bson import json_util
import json

json.dumps(anObject, default=json_util.default)

使用例(デシリアライズ)。

json.loads(aJsonString, object_hook=json_util.object_hook)


ジャンゴ

Djangoでは、ネイティブな DjangoJSONEncoder シリアライザーは、このようなことを適切に処理します。

参照 https://docs.djangoproject.com/en/dev/topics/serialization/#djangojsonencoder

from django.core.serializers.json import DjangoJSONEncoder

return json.dumps(
  item,
  sort_keys=True,
  indent=1,
  cls=DjangoJSONEncoder
)

との違いに気がついた。 DjangoJSONEncoder を使用することと、カスタム default このように

import datetime
import json

def default(o):
    if isinstance(o, (datetime.date, datetime.datetime)):
        return o.isoformat()

return json.dumps(
  item,
  sort_keys=True,
  indent=1,
  default=default
)

Djangoがデータを少しストリップしていることです。

 "last_login": "2018-08-03T10:51:42.990", # DjangoJSONEncoder 
 "last_login": "2018-08-03T10:51:42.990239", # default

ですから、場合によってはその点に注意する必要があるかもしれません。