要序列模型,添加自定義的JSON編碼器在下面的Python:
import datetime
from google.appengine.api import users
from google.appengine.ext import db
from django.utils import simplejson
class jsonEncoder(simplejson.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
return obj.isoformat()
elif isinstance(obj, db.Model):
return dict((p, getattr(obj, p))
for p in obj.properties())
elif isinstance(obj, users.User):
return obj.email()
else:
return simplejson.JSONEncoder.default(self, obj)
# use the encoder as:
simplejson.dumps(model, cls=jsonEncoder)
這將編碼:
爲了解碼之日起,您可以使用此javascript:
function decodeJsonDate(s){
return new Date(s.slice(0,19).replace('T',' ') + ' GMT');
} // Note that this function truncates milliseconds.
注:由於用戶pydave誰編輯這個代碼,使其更具可讀性。本來我已經使用Python的if/else語句表達,表達更少的線jsonEncoder
如下:(我已經添加了一些意見和使用google.appengine.ext.db.to_dict
,使其比原來更清晰。)
class jsonEncoder(simplejson.JSONEncoder):
def default(self, obj):
isa=lambda x: isinstance(obj, x) # isa(<type>)==True if obj is of type <type>
return obj.isoformat() if isa(datetime.datetime) else \
db.to_dict(obj) if isa(db.Model) else \
obj.email() if isa(users.User) else \
simplejson.JSONEncoder.default(self, obj)
代碼中存在一個小錯誤: 如果你有「output [key] = to_dict(model)」,它應該是:「output [key] = to_dict(value)」。 除此之外它是完美的 Thanks! – arikfr 2009-11-07 22:02:11
這段代碼在遇到UserProperty時會失敗,我用「output [key] = str )「在最後else,而不是提出錯誤 – 2009-12-15 21:03:21
好東西。小改進是使用iterkeys(),因爲你不使用」prop「。 – PEZ 2010-05-06 12:15:38