Saya ingin mengirim objek datetime.datetime dalam bentuk serial dari Python menggunakan JSON dan de-serialize dalam JavaScript menggunakan JSON. Apa cara terbaik untuk melakukan ini?
javascript
python
json
Peter Mortensen
sumber
sumber
Jawaban:
Anda dapat menambahkan parameter 'default' ke json.dumps untuk menangani ini:
Yaitu ISO 8601 format .
Fungsi pengendali default yang lebih komprehensif:
Pembaruan: Menambahkan output jenis dan juga nilai.
Pembaruan: Juga menangani tanggal
sumber
dthandler = lambda obj: obj.isoformat() if isinstance(obj, datetime) else json.JSONEncoder().default(obj)
Untuk proyek lintas bahasa, saya menemukan bahwa string yang berisi tanggal RfC 3339 adalah cara terbaik untuk pergi. Tanggal RfC 3339 terlihat seperti ini:
Saya pikir sebagian besar formatnya jelas. Satu-satunya hal yang agak tidak biasa adalah "Z" pada akhirnya. Itu singkatan dari GMT / UTC. Anda juga bisa menambahkan offset zona waktu seperti +02: 00 untuk CEST (Jerman di musim panas). Saya pribadi lebih suka menyimpan semuanya dalam UTC sampai ditampilkan.
Untuk tampilan, perbandingan, dan penyimpanan Anda dapat membiarkannya dalam format string di semua bahasa. Jika Anda memerlukan tanggal perhitungan mudah untuk mengubahnya kembali ke objek tanggal asli dalam sebagian besar bahasa.
Jadi hasilkan JSON seperti ini:
Sayangnya, konstruktor Date Javascript tidak menerima string RfC 3339 tetapi ada banyak parser yang tersedia di Internet.
huTools.hujson mencoba menangani masalah penyandian paling umum yang mungkin Anda temui dalam kode Python termasuk objek tanggal / datetime sambil menangani zona waktu dengan benar.
sumber
datetime
: datetime.isoformat () dan olehsimplejson
, yang akan membuangdatetime
objek sebagaiisoformat
string secara default. Tidak perlustrftime
melakukan peretasan manual .datetime
objek keisoformat
string. Bagi saya,simplejson.dumps(datetime.now())
hasilTypeError: datetime.datetime(...) is not JSON serializable
json.dumps(datetime.datetime.now().isoformat())
Di sinilah keajaiban terjadi.Saya sudah mengerjakannya.
Katakanlah Anda memiliki objek datetime Python, d , dibuat dengan datetime.now (). Nilainya adalah:
Anda bisa membuat cerita bersambung menjadi JSON sebagai string datetime ISO 8601:
Objek datetime contoh akan diserialisasi sebagai:
Nilai ini, setelah diterima di lapisan Javascript, dapat membuat objek Tanggal:
Pada Javascript 1.8.5, Objek tanggal memiliki metode toJSON, yang mengembalikan string dalam format standar. Untuk membuat serial objek Javascript di atas kembali ke JSON, maka perintahnya adalah:
Yang akan memberi Anda:
String ini, setelah diterima dengan Python, dapat dideserialisasi kembali ke objek datetime:
Ini menghasilkan objek datetime berikut, yang sama dengan yang Anda mulai dan karenanya benar:
sumber
Dengan menggunakan
json
, Anda dapat mensubklasifikasikan JSONEncoder dan mengganti metode default () untuk memberikan serializers khusus:Kemudian, Anda dapat menyebutnya seperti ini:
sumber
obj.isoformat()
. Anda juga dapat menggunakandumps()
panggilan yang lebih umum , yang menggunakan argumen berguna lainnya (sepertiindent
): simplejson.dumps (myobj, cls = JSONEncoder, ...)Berikut adalah solusi yang cukup lengkap untuk pengkodean dan penguraian ulang objek datetime.datetime dan datetime.date secara rekursif menggunakan
json
modul library standar . Ini perlu Python> = 2.6 karena%f
kode format dalam string format datetime.datetime.strptime () hanya didukung sejak saat itu. Untuk dukungan Python 2.5, jatuhkan%f
dan lepaskan mikrodetik dari string tanggal ISO sebelum mencoba mengonversinya, tetapi Anda akan kehilangan presisi mikrodetik, tentu saja. Untuk interoperabilitas dengan string tanggal ISO dari sumber lain, yang mungkin menyertakan nama zona waktu atau offset UTC, Anda juga mungkin perlu menghapus beberapa bagian string tanggal sebelum konversi. Untuk parser lengkap untuk string tanggal ISO (dan banyak format tanggal lainnya) lihat modul dateutil pihak ketiga .Decoding hanya berfungsi ketika string tanggal ISO adalah nilai dalam notasi objek literal JavaScript atau dalam struktur bersarang di dalam objek. String tanggal ISO, yang merupakan item dari array level atas tidak akan akan diterjemahkan.
Yaitu ini berfungsi:
Dan ini juga:
Tapi ini tidak berfungsi seperti yang diharapkan:
Berikut kodenya:
sumber
datetime.datetime.utcnow().isoformat()[:-3]+"Z"
itu akan persis seperti apa yang dihasilkan JSON.stringify () dalam javascriptJika Anda yakin hanya Javascript yang akan menggunakan JSON, saya lebih suka meneruskan Javascript
Date
objek secara langsung.The
ctime()
metode padadatetime
objek akan mengembalikan string bahwa Javascript Tanggal objek bisa mengerti.Javascript akan dengan senang hati menggunakannya sebagai objek literal, dan Anda memiliki objek Date Anda.
sumber
.ctime()
adalah cara yang SANGAT buruk untuk menyampaikan informasi waktu,.isoformat()
jauh lebih baik. Apa yang.ctime()
dilakukan adalah membuang zona waktu dan penghematan siang hari seolah-olah tidak ada. Fungsi itu harus dibunuh.Terlambat dalam permainan ... :)
Solusi yang sangat sederhana adalah dengan menambal standar modul json. Sebagai contoh:
Sekarang, Anda dapat menggunakan json.dumps () seolah-olah itu selalu mendukung datetime ...
Ini masuk akal jika Anda memerlukan ekstensi ini ke modul json untuk selalu masuk dan ingin tidak mengubah cara Anda atau orang lain menggunakan serialisasi json (baik dalam kode yang ada atau tidak).
Perhatikan bahwa beberapa orang mungkin menganggap menambal perpustakaan dengan cara itu sebagai praktik yang buruk. Perhatian khusus perlu diambil jika Anda mungkin ingin memperpanjang aplikasi Anda dengan lebih dari satu cara - adalah kasus seperti itu, saya sarankan untuk menggunakan solusi oleh ramen atau JT dan pilih ekstensi json yang tepat dalam setiap kasus.
sumber
None
. Anda mungkin ingin melempar pengecualian.Tidak banyak yang ditambahkan ke jawaban wiki komunitas, kecuali stempel waktu !
Javascript menggunakan format berikut:
Sisi python (untuk
json.dumps
pawang, lihat jawaban lain):Jika Anda membiarkan Z keluar, kerangka kerja frontend seperti angular tidak dapat menampilkan tanggal di zona waktu browser-lokal:
sumber
Di sisi python:
Di sisi javascript:
di mana data adalah hasil dari python
sumber
Saran saya adalah menggunakan perpustakaan. Ada beberapa yang tersedia di pypi.org.
Saya menggunakan ini, ini berfungsi baik: https://pypi.python.org/pypi/asjson
sumber
Rupanya format tanggal JSON "JavaScript" yang benar adalah 2012-04-23T18: 25: 43.511Z - UTC dan "Z". Tanpa JavaScript ini akan menggunakan zona waktu lokal browser web saat membuat objek Date () dari string.
Untuk waktu "naif" (apa yang Python sebut waktu tanpa zona waktu dan ini dianggap lokal) di bawah ini akan memaksa zona waktu lokal sehingga kemudian dapat dikonversi dengan benar ke UTC:
mengapa ini sangat sulit.
sumber
Untuk konversi tanggal Python ke JavaScript, objek tanggal harus dalam format ISO tertentu, yaitu format ISO atau nomor UNIX. Jika format ISO tidak memiliki beberapa info, maka Anda dapat mengonversi ke nomor Unix dengan Date.parse terlebih dahulu. Selain itu, Date.parse bekerja dengan Bereaksi juga sementara Tanggal baru dapat memicu pengecualian.
Jika Anda memiliki objek DateTime tanpa milidetik, hal-hal berikut perlu dipertimbangkan. :
Tanggal contoh bisa juga variabel di objek result.data setelah panggilan API.
Untuk opsi untuk menampilkan tanggal dalam format yang diinginkan (mis. Untuk menampilkan hari kerja yang panjang) periksa MDN doc .
sumber