Saya mencoba memiliki format tanggal khusus dalam keluaran Gson, tetapi .setDateFormat(DateFormat.FULL)
sepertinya tidak berfungsi dan sama dengan itu .registerTypeAdapter(Date.class, new DateSerializer())
.
Ini seperti Gson tidak peduli dengan objek "Date" dan mencetaknya dengan caranya.
Bagaimana saya bisa mengubahnya?
Terima kasih
EDIT:
@Entity
public class AdviceSheet {
public Date lastModif;
[...]
}
public void method {
Gson gson = new GsonBuilder().setDateFormat(DateFormat.LONG).create();
System.out.println(gson.toJson(adviceSheet);
}
Saya selalu menggunakan java.util.Date
; setDateFormat()
tidak bekerja :(
Jawaban:
Tampaknya Anda perlu menentukan format untuk bagian tanggal dan waktu atau menggunakan pemformatan berbasis string. Sebagai contoh:
atau menggunakan java.text.DateFormat
atau melakukannya dengan serializers:
Saya percaya bahwa pemformat tidak dapat menghasilkan cap waktu, tetapi pasangan seri / deserializer ini tampaknya berfungsi
Jika menggunakan Java 8 atau lebih baru Anda harus menggunakan serializers / deserializers di atas seperti:
sumber
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
bekerja.Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
bekerjaFormat di atas sepertinya lebih baik bagi saya karena memiliki presisi hingga milidetik.
sumber
Seperti yang ditunjukkan ML, JsonSerializer bekerja di sini. Namun, jika Anda memformat entitas basis data, gunakan java.sql.Date untuk mendaftarkan serializer Anda. Deserializer tidak diperlukan.
Laporan bug ini mungkin terkait: http://code.google.com/p/google-gson/issues/detail?id=230 . Saya menggunakan versi 1.7.2.
sumber
Jika Anda membenci kelas dalam, dengan memanfaatkan antarmuka fungsional, Anda dapat menulis lebih sedikit kode di Java 8 dengan ekspresi lambda.
sumber
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, (JsonDeserializer) (json, typeOfT, context) -> new Date(json.getAsLong())).create();
Ini tidak akan berhasil sama sekali. Tidak ada tipe tanggal di JSON. Saya akan merekomendasikan untuk membuat serial ke ISO8601 bolak-balik (untuk format agnostik dan JS compat). Pertimbangkan bahwa Anda harus tahu bidang mana yang berisi tanggal.
sumber
Anda dapat menentukan format
Gson gson = builder.setDateFormat("yyyy-MM-dd").create();
dalam metode ini alih-alihyyyy-MM-dd
menggunakan format lainnyasumber
Ini adalah bug . Saat ini Anda harus menetapkan
timeStyle
juga atau menggunakan salah satu alternatif yang dijelaskan dalam jawaban lain.sumber
Saya menggunakan Gson 2.8.6 dan menemukan bug ini hari ini.
Pendekatan saya memungkinkan semua klien kami yang ada (seluler / web / dll) untuk terus berfungsi sebagaimana mestinya, tetapi menambahkan beberapa penanganan bagi mereka yang menggunakan format 24jam dan memungkinkan miliaran juga, untuk ukuran yang baik.
Saya tetap membuat serialisasi sama seperti semua klien memahami format tanggal json standar.
Biasanya, saya pikir itu bukan praktik yang baik untuk menggunakan blok coba / tangkap, tetapi ini harus menjadi kasus yang cukup langka.
sumber