NOTE OF CAUTION: This produces valid Javascript code but not necessarily valid-JSON code and therefore may not work with your JSON parser. It does work with major browsers that I've tested, but you are responsible for your code.
Sometimes you just need to send a datetime object to your client-side Javascript via JSON. This slice will show you how. First, take this code and put it in your favorite utility module:
import re
try:
import json
except:
import simplejson as json
__jsdateregexp__ = re.compile(r'"\*\*(new Date\([0-9,]+\))"')
class __JSONDateEncoder__(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return '**new Date(%i,%i,%i,%i,%i,%i)' % (obj.year,
obj.month-1,
obj.day,
obj.hour,
obj.minute,
obj.second)
if isinstance(obj, date):
return '**new Date(%i,%i,%i)' % (obj.year,
obj.month-1,
obj.day)
return json.JSONEncoder.default(self, obj)
def dumps(obj):
""" A (simple)json wrapper that can wrap up python datetime and date
objects into Javascript date objects.
@param obj: the python object (possibly containing dates or datetimes) for
(simple)json to serialize into JSON
@returns: JSON version of the passed object
"""
out = __jsdateregexp__.sub(r'\1', json.dumps(obj, cls=__JSONDateEncoder__))
return unicode(out).decode('utf-8')
Now in your controller or view (where ever you serialize your data) , instead of importing json or simplejson, import the utility module that you placed the above code in. In the following example, we'll just call it "util".
import datetime
from util import dumps
def index():
jsondata = dict(username=request.get_vars.username, logintime=datetime.datetime.now())
return dict(jsondata=dumps(jsondata)
Note that this does not work with the JSON-RPC service since it handles it's own serialization that does not go through util.dumps.
Comments (0)