JSON datetime между Python и JavaScript

Я бы также подумал об использовании bindParam из привычки .. Мое понимание заключается в том, что PDO будет выполнять проверку типа (не то, что это важно для PARAM_STR), что может спасти вас от некоторых других векторов атаки.

(и добавьте в XSS, дезинфицирующее Скатокс, Райан и Иоанн упоминание.)

$name = isset($_POST['name']) ? htmlspecialchars($_POST['name']) : NULL;
$email = isset($_POST['email']) ? htmlspecialchars($_POST['email']) : NULL;
stmt = bindParam(':name',$name, PDO::PARAM_STR);
stmt = bindParam(':email',$email, PDO::PARAM_STR);
$stmt->execute();

387
задан Peter Mortensen 13 December 2009 в 20:34
поделиться

5 ответов

Для межъязыковых проектов я узнал, что представляет в виде строки содержащий , даты RFC 3339 являются лучшим способом пойти. Дата RFC 3339 похожа на это:

  1985-04-12T23:20:50.52Z

я думаю, что большая часть формата очевидна. Единственной несколько необычной вещью может быть "Z" в конце. Это обозначает GMT/UTC. Вы могли также добавить смещение часового пояса как +02:00 для ПОЯСА (Германия летом). Я лично предпочитаю сохранять все в UTC, пока он не отображен.

Для отображения, сравнений и устройства хранения данных можно оставить его в формате строки через все языки. Если Вам нужна дата вычислений, легких преобразовать его назад в собственный объект даты на большей части языка.

Так генерируют JSON как это:

  json.dump(datetime.now().strftime('%Y-%m-%dT%H:%M:%SZ'))

, К сожалению, Конструктор Date JavaScript не принимает строки RFC 3339, но существуют многие синтаксические анализаторы доступны в Интернете.

huTools.hujson пытается обработать наиболее распространенные проблемы кодирования, с которыми Вы могли бы столкнуться в коде Python включая объекты даты/даты и времени при обработке часовых поясов правильно.

76
ответ дан Gokul 13 December 2009 в 20:34
поделиться
  • 1
    +1, хотя I' d предполагают использовать HEAD вместо GET в вызове к conn.request, было бы более эффективным, с тех пор you' ре, только проверяющее, чтобы видеть, существует ли это. – Daniel Roseman 21 March 2010 в 10:58

Если Вы уверены, что только JavaScript будет использовать JSON, я предпочитаю передавать объекты Javascript Date непосредственно.

ctime() метод на datetime объекты возвратят строку, которую может понять объект Даты JavaScript.

import datetime
date = datetime.datetime.today()
json = '{"mydate":new Date("%s")}' % date.ctime()

JavaScript будет счастливо использовать это в качестве литерала объектов, и у Вас есть свой объект Даты, созданный прямо в.

23
ответ дан Triptych 13 December 2009 в 20:34
поделиться
  • 1
    @SpawnCxy, Сначала я думал как этот, но когда я перехожу к тому URL, fakeImage.jpg не существует и его перенаправленный к index.html, таким образом, я принимаю его больше, чем пример. – YOU 21 March 2010 в 07:31

Вы можете добавить параметр 'default' в файл json.dumps, чтобы справиться с этим:

date_handler = lambda obj: (
    obj.isoformat()
    if isinstance(obj, (datetime.datetime, datetime.date))
    else None
)
json.dumps(datetime.datetime.now(), default=date_handler)
'"2010-04-20T20:08:21.634121"'

Формат ISO 8601 .

Более полная функция обработчика по умолчанию:

def handler(obj):
    if hasattr(obj, 'isoformat'):
        return obj.isoformat()
    elif isinstance(obj, ...):
        return ...
    else:
        raise TypeError, 'Object of type %s with value of %s is not JSON serializable' % (type(obj), repr(obj))

Обновление: добавлен вывод типа, а также значения.
Обновление: также обрабатывать дату

368
ответ дан 22 November 2019 в 23:49
поделиться

Используя json , вы можете создать подкласс JSONEncoder и переопределить метод default (), чтобы предоставить свои собственные сериализаторы:

import json
import datetime

class DateTimeJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return obj.isoformat()
        else:
            return super(DateTimeJSONEncoder, self).default(obj)

Затем вы можете вызвать его следующим образом:

>>> DateTimeJSONEncoder().encode([datetime.datetime.now()])
'["2010-06-15T14:42:28"]'
49
ответ дан 22 November 2019 в 23:49
поделиться

Вот довольно полное решение для рекурсивного кодирования и декодирования объектов datetime.datetime и datetime.date с использованием модуля стандартной библиотеки json . Для этого требуется Python> = 2.6, поскольку с тех пор код формата % f в строке формата datetime.datetime.strptime () поддерживается только в. Для поддержки Python 2.5 удалите % f и удалите микросекунды из строки даты ISO, прежде чем пытаться преобразовать ее, но, конечно, вы потеряете точность в микросекундах. Для взаимодействия со строками даты ISO из других источников, которые могут включать имя часового пояса или смещение UTC, вам также может потребоваться удалить некоторые части строки даты перед преобразованием. Полный синтаксический анализатор строк даты ISO (и многих других форматов даты) см. В стороннем модуле dateutil .

Декодирование работает, только если строки даты ISO являются значениями в JavaScript. буквальное обозначение объекта или во вложенных структурах внутри объекта. Дата ISO строки, которые являются элементами массива верхнего уровня, не декодируются.

Т.е. это работает:

date = datetime.datetime.now()
>>> json = dumps(dict(foo='bar', innerdict=dict(date=date)))
>>> json
'{"innerdict": {"date": "2010-07-15T13:16:38.365579"}, "foo": "bar"}'
>>> loads(json)
{u'innerdict': {u'date': datetime.datetime(2010, 7, 15, 13, 16, 38, 365579)},
u'foo': u'bar'}

И это тоже:

>>> json = dumps(['foo', 'bar', dict(date=date)])
>>> json
'["foo", "bar", {"date": "2010-07-15T13:16:38.365579"}]'
>>> loads(json)
[u'foo', u'bar', {u'date': datetime.datetime(2010, 7, 15, 13, 16, 38, 365579)}]

Но это работает не так, как ожидалось:

>>> json = dumps(['foo', 'bar', date])
>>> json
'["foo", "bar", "2010-07-15T13:16:38.365579"]'
>>> loads(json)
[u'foo', u'bar', u'2010-07-15T13:16:38.365579']

Вот код:

__all__ = ['dumps', 'loads']

import datetime

try:
    import json
except ImportError:
    import simplejson as json

class JSONDateTimeEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, (datetime.date, datetime.datetime)):
            return obj.isoformat()
        else:
            return json.JSONEncoder.default(self, obj)

def datetime_decoder(d):
    if isinstance(d, list):
        pairs = enumerate(d)
    elif isinstance(d, dict):
        pairs = d.items()
    result = []
    for k,v in pairs:
        if isinstance(v, basestring):
            try:
                # The %f format code is only supported in Python >= 2.6.
                # For Python <= 2.5 strip off microseconds
                # v = datetime.datetime.strptime(v.rsplit('.', 1)[0],
                #     '%Y-%m-%dT%H:%M:%S')
                v = datetime.datetime.strptime(v, '%Y-%m-%dT%H:%M:%S.%f')
            except ValueError:
                try:
                    v = datetime.datetime.strptime(v, '%Y-%m-%d').date()
                except ValueError:
                    pass
        elif isinstance(v, (dict, list)):
            v = datetime_decoder(v)
        result.append((k, v))
    if isinstance(d, list):
        return [x[1] for x in result]
    elif isinstance(d, dict):
        return dict(result)

def dumps(obj):
    return json.dumps(obj, cls=JSONDateTimeEncoder)

def loads(obj):
    return json.loads(obj, object_hook=datetime_decoder)

if __name__ == '__main__':
    mytimestamp = datetime.datetime.utcnow()
    mydate = datetime.date.today()
    data = dict(
        foo = 42,
        bar = [mytimestamp, mydate],
        date = mydate,
        timestamp = mytimestamp,
        struct = dict(
            date2 = mydate,
            timestamp2 = mytimestamp
        )
    )

    print repr(data)
    jsonstring = dumps(data)
    print jsonstring
    print repr(loads(jsonstring))
30
ответ дан 22 November 2019 в 23:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: