пятница, 23 июля 2010 г.

Python datetime to javascript Date

В Django есть DjangoJSONEncoder, который используется при конвертировании данных в json-формат. Он форматирует дату в строку. Пришлось написать свой енкодер, что бы на клиенте получать обьект Date, а не строку.

Copy Source | Copy HTML
  1. from django.utils import simplejson
  2.  
  3. class DatetimeJSONEncoder(simplejson.JSONEncoder):
  4.  
  5.     class DateInt(int):
  6.         '''
            Наследуемся от int, потому что тогда значение будет без "".
            В других случаях получим: "new Date(100500)" и при eval будет просто
            строка.
            '''
  7.         def __str__(self):
  8.             return 'new Date(%s)' % (self*1000)
  9.  
  10.     def default(self, o):
  11.         from django.utils import datetime_safe
  12.         from datetime import datetime
  13.         import time
  14.  
  15.         if isinstance(o, datetime):
  16.             d = datetime_safe.new_datetime(o)
  17.             return self.DateInt(int(time.mktime(d.timetuple())))
  18.         else:
  19.             return super(DatetimeJSONEncoder, self).default(o)
  20.  
  21. #example
  22. from datetime import datetime
  23. from django.utils import simplejson
  24.  
  25. data = dict(date=datetime.now())
  26. json = simplejson.dumps(data, cls=DjangoJSONEncoder)

4 коммент.:

  1. Извращение какое-то, и уж точно обрабатывать JSON на клиенте через eval это уже ниже плинтуса.

    ОтветитьУдалить
  2. ИМХО грязный хак. В итоге получаешь нечто не удовлетворяющее стандарту JSON.

    ОтветитьУдалить
  3. > Извращение какое-то, и уж точно обрабатывать
    > JSON на клиенте через eval это уже ниже плинтуса.

    JSON я сам не обрабаваю, пользовался ExtJS или jQUery.
    Вот кусок кода из ExtJs:

    doDecode = function(json){
    return eval("(" + json + ')');
    },

    Вот как в jQuery: http://github.com/jquery/jquery/blob/master/src/core.js#L500
    что практически равнозначно.

    А как вы обрабатываете JSON?

    ОтветитьУдалить
  4. Да, это грязный хак. Иначе пришлось бы хакать на клиенте.

    ОтветитьУдалить