私はトルネード (実際にはサイクロン) で構築していますが、RequestHandler.write がオブジェクトの一部を窒息させています。tornado でこれらのオブジェクトの JSONencoder を作成するにはどうすればよいですか?
複雑な問題が 1 つあります。一部のオブジェクトは外部ライブラリから借用されているため、実際にはそれらのコンストラクターにアクセスできません。
コードを投稿していないことをお詫びします。ここから始める方法がわかりません。
はい、メインループの前にこれを追加することで、デフォルトのエンコーダーを変更できます
import json
json._default_encoder = YourJSONEncoder() #patch json
基本的に、tornado はカスタム json フォーマットをサポートしていないため、json ライブラリを使用する必要があるというのが答えです。最後に使用したコードは次のとおりです。
import json
class MongoEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, ObjectId):
return str(obj)
return json.JSONEncoder.default(self, obj)
print json.dumps(my_mong_obj, cls=MongoEncoder, indent=2)
json 形式の datetime オブジェクトの場合、次のようになります。
import json
dthandler = lambda obj: obj.isoformat() if isinstance(obj, datetime) else None
response = json.dumps(data, ensure_ascii=False, default=dthandler)
これが私のモンキーパッチです:
import json, datetime
from tornado import escape
DT_HANDLER = lambda obj: obj.isoformat() if isinstance(obj, datetime.datetime) or isinstance(obj, datetime.date) else None
def json_encode(value):
return json.dumps(value, default=DT_HANDLER).replace("</", "<\/")
escape.json_encode = json_encode