GAE/PythonデータストアのエンティティをQueryクラスからJSONに変換する。

GAE/Pythonに格納したデータをJSONで取得したいなぁと思ったのだが、一から全部書くのは面倒だったので何かないかと思っていたら、 こちらのブログ を見て、 Google CodeにGQLからJSONに変換するツールがある のを知った。

ただ、このコードだと、Queryクラスでは使えない。普段Queryクラスの方を使っているので下記のように変更した。

$ diff -u json.py.org json.py
--- json.py.org 2011-04-20 15:42:18.000000000 +0900
+++ json.py     2011-04-20 16:10:33.000000000 +0900
@@ -48,7 +48,7 @@
     if hasattr(obj, '__json__'):
       return getattr(obj, '__json__')()

-    if isinstance(obj, db.GqlQuery):
+    if isinstance(obj, db.GqlQuery) or isinstance(obj, db.Query):
       return list(obj)

     elif isinstance(obj, db.Model):

こんな感じでやれば、

import json
from models import BodyComposition
from google.appengine.ext import webapp
from google.appengine.ext import db

class DataBodyComposition(webapp.RequestHandler):
    def get(self):
        body_compos_query = BodyComposition.all()
        self.response.out.write(json.encode(body_compos_query))

JSONにできましたよと。

[{"measurement_datetime": {"ctime": "Wed Apr 20 01:50:00 2011", "hour": 1, "isoweekday": 3, "month": 4, "second": 0, "microsecond": 0,
"isocalendar": [2011, 16, 3], "timetuple": [2011, 4, 20, 1, 50, 0, 2, 110, -1], "year": 2011, "epoch": 1303264200.0,
"isoformat": "2011-04-20T01:50:00", "day": 20, "minute": 50}, "body_age": 35, "weight": 66.700000000000003,
"basal_metabolism": 1580, "bmi": 22.100000000000001, "skeltal_mascle_percentage": 36.700000000000003,
"bodyfat_percentage": 21.300000000000001,
"ownerid": {"nickname": "test@example.com", "email": "test@example.com", "auth_domain": "gmail.com"}, "bodyfat_lv": 7}]