모델을 직렬화하려면 다음 Python과 같이 사용자 지정 json 인코더를 추가합니다.
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)
simplejson.dumps(model, cls=jsonEncoder)
다음과 같이 인코딩됩니다.
- isoformat 문자열로 날짜 ( 이 제안에 따라 ),
- 속성의 dict로서의 모델,
- 사용자를 이메일로
날짜를 디코딩하려면이 자바 스크립트를 사용할 수 있습니다.
function decodeJsonDate(s){
return new Date( s.slice(0,19).replace('T',' ') + ' GMT' );
} // Note that this function truncates milliseconds.
참고 : 이 코드를 더 읽기 쉽게 편집 한 사용자 pydave 에게 감사드립니다 . 나는 원래 파이썬의 if / else 표현식을 사용 jsonEncoder
하여 다음과 같이 더 적은 줄로 표현 했습니다 google.appengine.ext.db.to_dict
.
class jsonEncoder(simplejson.JSONEncoder):
def default(self, obj):
isa=lambda x: isinstance(obj, x)
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)