web-dev-qa-db-ja.com

datetime.date(2014、4、25)は、Django=

私は Pythonで "datetime.datetime not JSON serializable"を克服する方法? に従いましたが、これは役に立たない

私はこのコードを試しました

>>> import datetime
>>> a =datetime.date(2014, 4, 25)
>>> from bson import json_util
>>> b = json.dumps(a,default = json_util.default)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.7/json/__init__.py", line 250, in dumps
    sort_keys=sort_keys, **kw).encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/home/.../python2.7/site-packages/bson/json_util.py", line 256, in default
    raise TypeError("%r is not JSON serializable" % obj)
TypeError: datetime.date(2014, 4, 25) is not JSON serializable

誰かが私を助けることができますかdatetime.dateシリアライザーとデシリアライザー。

26

これも行うことができます:

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

print json.dumps(data, default=date_handler)

here から。

J.F。セバスチャンのコメントによる更新

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

print json.dumps(data, default=date_handler)
64
AlexandruC

日付を文字列に変換してから、

a = str( datetime.now() )
12

Jsonパッケージのドキュメントの「エンコーダの拡張」セクションを参照してください https://docs.python.org/2/library/json.html

私はこの方法を使用しましたが、非常に効果的でした。これがあなたが探しているものだと思います。

import json
class DatetimeEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.strftime('%Y-%m-%dT%H:%M:%SZ')
        Elif isinstance(obj, date):
            return obj.strftime('%Y-%m-%d')
        # Let the base class default method raise the TypeError
        return json.JSONEncoder.default(self, obj)

json.dumps(dict,cls=DatetimeEncoder)
9

モデルのクエリセットを処理するときに、JSONジャンプ関数に日時エンコーダーを追加できます。これは、解析中のベースDjangoモデル状態に問題があるため、少しカスタマイズされています

import datetime
import decimal
from Django.db.models.base import ModelState

class DateTimeEncoder(json.JSONEncoder):
    def default(self, obj):
       if hasattr(obj, 'isoformat'):
           return obj.isoformat()
       Elif isinstance(obj, decimal.Decimal):
           return float(obj)
       Elif isinstance(obj, ModelState):
           return None
       else:
           return json.JSONEncoder.default(self, obj)

次に、jsonダンプでこのクラスを使用します

b = json.dumps(a, cls = DateTimeEncoder)
7
Greg

特にDjangoを1.7から1.9に更新した後、これは非常に貴重であることがわかりました。このほとんどはブログからのものです http://arthurpemberton.com/2015/04/ fix-uuid-is-not-json-serializable これをmodels.pyのインポートの直下に置きます。UUIDも処理されます。

from uuid import UUID
import datetime
JSONEncoder_olddefault = JSONEncoder.default
def JSONEncoder_newdefault(self, o):
    if isinstance(o, UUID): return str(o)
    if isinstance(o, datetime.datetime): return str(o)
    return JSONEncoder_olddefault(self, o)
JSONEncoder.default = JSONEncoder_newdefault
2
std''OrgnlDave