to_dict() には key が含まれないので、key が必要な場合には明示的に追加します。
fetched_list = MyModel.query().fetch() json_without_keyid = json.dumps([c.to_dict() for c in fetched_list ]) json_with_keyid = json.dumps([dict(c.to_dict(), **dict(id=c.key.id())) for c in fetched_list ])
追記
数字や文字列のみの場合上記のコードで問題なかったのですが、DateProperty を使用していた Model は
File "C:\Python27\lib\json\encoder.py", line 184, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: datetime.date(2015, 2, 20) is not JSON serializable
というエラーで json 化に失敗してしまいました。
そこで、以下のように、date オブジェクトの場合の処理を追加した JSONEncoder を作成し、対応を加えました。datetime の場合なども同じような方法で対応できるはずです。
from datetime import date
class JSONDateEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, date):
return obj.isoformat()
return json.JSONEncoder.default(self, obj)
fetched_list = MyModel.query().fetch()
json_without_keyid = json.dumps([c.to_dict() for c in fetched_list ], cls=JSONDateEncoder)
json_with_keyid = json.dumps([dict(c.to_dict(), **dict(id=c.key.id())) for c in fetched_list ], cls=JSONDateEncoder)
参考:AppEngine Making ndb models json serializable、How to overcome “datetime.datetime not JSON serializable” in python?
0 件のコメント:
コメントを投稿