JSONシリアライズで、datetime に注意する

datetime 型、date型を含むオブジェクトを JSONシリアライズしようとして、
 AttributeError: 'datetime.datetime' object has no attribute '__dict__'
が発生するのを回避する場合、
json.dumps メソッドの default メソッドで以下のシリアライズメソッドを用意すること。

def toJson(obj):
    if isinstance(obj, datetime):
        return obj.strftime('%Y-%m-%d %H:%M:%S')
    elif isinstance(obj, date):
        return obj.strftime('%Y-%m-%d')
    else:
        return obj.__dict__

# datetime を含む userオブジェクトをシリアライズする。
str = json.dumps(user, default=toJson, indent=3)

長くて可読性が悪いけど、上のようにメソッドを用意しないなら、、

s = json.dumps(user, default=lambda o: o.strftime('%Y-%m-%d %H:%M:%S') if isinstance(o, datetime)
                    else o.strftime('%Y-%m-%d') if isinstance(o, date) else o.__dict__, indent=2)

ラムダ式の中の if~else 3項演算子で、改行を入れているが1行で済む。