[解決済み】「datetime.datetime not JSON serializable」を克服する方法とは?
質問
以下のような基本的な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
ですから、場合によってはその点に注意する必要があるかもしれません。
関連
-
Python関数の高度な応用を解説
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み] 正しいJSONコンテンツタイプは何ですか?
-
[解決済み] JSONでコメントを使用することはできますか?
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] クラスをJSONシリアライザブルにする方法
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
PythonによるExcelファイルの一括操作の説明
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】ImportError: bs4という名前のモジュールがない(BeautifulSoup)
-
[解決済み] オブジェクトの現在のプロパティと値をすべて表示する組み込み関数はありますか?