jsonの変換

jsonは便利だけどオブジェクトについては
文字列に変換しろやこらって怒られる。その対処。

import json
from bson.objectid import ObjectId  #<-pymongoに含まれる
from bson import json_util          #<-pymongoに含まれる
from datetime import datetime

class mongoEncoder(json.JSONEncoder):
    def default(self, obj):
        #_idはObjectId型で、JSONではSerializeできない。よって変換する
        if isinstance(obj, ObjectId):
            return json_util.default(obj)
        elif isinstance(obj, datetime):
            return obj.strftime("%Y-%m-%d %H:%M:%S")
        else:
            return obj
        return json.JSONEncoder.default(self, obj)

ダンプする時に上を参照する。

    data = db.find() # いろいろ省略
    ret = [eval(json.dumps(d, ensure_ascii=False, cls=mongoEncoder)) for d in data] 

Cursor型のdataを1件づつdにつっこんで、dumpしつつ配列にする。
その時ObjectIdとdatetimeを意味のある文字列にする。みたいなコード。