413 Stimmen

JSON Datum- und Uhrzeit zwischen Python und JavaScript

Ich möchte ein datetime.datetime-Objekt in serialisierter Form von Python aus mithilfe von JSON senden und in JavaScript unter Verwendung von JSON de-serialisieren. Wie ist der beste Weg, dies zu tun?

0 Stimmen

Bevorzugen Sie die Verwendung einer Bibliothek oder möchten Sie dies selbst codieren?

24voto

Kenan Banks Punkte 196831

Wenn Sie sicher sind, dass nur JavaScript das JSON verbrauchen wird, ziehe ich es vor, JavaScript Date-Objekte direkt zu übergeben.

Die Methode ctime() auf datetime-Objekten gibt einen String zurück, den das JavaScript Date-Objekt verstehen kann.

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

JavaScript wird dies gerne als Objektliteral verwenden und Sie haben Ihr Date-Objekt direkt erstellt.

12 Stimmen

Technisch gesehen kein gültiges JSON, aber es ist ein gültiges JavaScript-Objektliteral. (Aus Prinzip würde ich den Content-Type auf text/javascript statt application/json setzen.) Wenn der Verbraucher immer und für immer nur eine JavaScript-Implementierung ist, dann ja, das ist ziemlich elegant. Ich würde es verwenden.

13 Stimmen

.ctime() ist eine SEHR schlechte Methode, um Zeitinformationen weiterzugeben, .isoformat() ist viel besser. Was .ctime() tut, ist, Zeitzone und Sommerzeit einfach zu ignorieren, als ob sie nicht existieren würden. Diese Funktion sollte gelöscht werden.

0 Stimmen

Jahre später: Bitte überlegen Sie niemals, dies zu tun. Dies funktioniert nur, wenn Sie Ihr JSON in Javascript mit eval() auswerten, was Sie wirklich nicht tun sollten...

12voto

davidhadas Punkte 2233

Eine sehr einfache Lösung besteht darin, das Standardverhalten des json-Moduls zu patchen.

Zum Beispiel:

import json
import datetime

json.JSONEncoder.default = lambda self,obj: (obj.isoformat() if isinstance(obj, datetime.datetime) else None)

Jetzt können Sie json.dumps() verwenden, als ob es datetime immer unterstützt hätte...

json.dumps({'created':datetime.datetime.now()})

Dies macht Sinn, wenn Sie diese Erweiterung des json-Moduls dauerhaft aktiviert haben möchten und die Art und Weise, wie Sie oder andere die JSON Serialisierung verwenden, nicht ändern möchten (entweder im bestehenden Code oder nicht).

Bitte beachten Sie, dass einige das Patchen von Bibliotheken auf diese Weise als schlechte Praxis betrachten könnten.

Besondere Vorsicht ist geboten, wenn Sie Ihre Anwendung auf mehr als eine Weise erweitern möchten. In einem solchen Fall empfehle ich, die Lösung von ramen oder JT zu verwenden und für jeden Fall die geeignete JSON-Erweiterung zu wählen.

6 Stimmen

Dieses Programm frisst stillschweigend nicht serialisierbare Objekte und verwandelt sie in None. Möglicherweise möchten Sie stattdessen eine Ausnahme werfen.

7voto

user1338062 Punkte 10425

Nicht viel hinzuzufügen zu der Community-Wiki-Antwort, außer für Zeitstempel!

JavaScript verwendet das folgende Format:

new Date().toJSON() // "2016-01-08T19:00:00.123Z"

Auf der Python-Seite (für den json.dumps-Handler, siehe die anderen Antworten):

>>> from datetime import datetime
>>> d = datetime.strptime('2016-01-08T19:00:00.123Z', '%Y-%m-%dT%H:%M:%S.%fZ')
>>> d
datetime.datetime(2016, 1, 8, 19, 0, 0, 123000)
>>> d.isoformat() + 'Z'
'2016-01-08T19:00:00.123000Z'

Wenn Sie dieses Z weglassen, können Frontend-Frameworks wie Angular das Datum nicht in der browserlokalen Zeitzone anzeigen:

> $filter('date')('2016-01-08T19:00:00.123000Z', 'yyyy-MM-dd HH:mm:ss')
"2016-01-08 20:00:00"
> $filter('date')('2016-01-08T19:00:00.123000', 'yyyy-MM-dd HH:mm:ss')
"2016-01-08 19:00:00"

4voto

Sank Punkte 121

Auf der Python-Seite:

import time, json
from datetime import datetime as dt
your_date = dt.now()
data = json.dumps(time.mktime(your_date.timetuple())*1000)
return data # Daten an JavaScript senden

Auf der JavaScript-Seite:

var your_date = new Date(data)

wo data das Ergebnis aus Python ist.

4voto

guettli Punkte 23426

Mein Rat ist, eine Bibliothek zu verwenden. Es gibt mehrere verfügbar unter pypi.org.

Ich benutze asjson, und es funktioniert gut.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X