Próbuję mieć niestandardowy format daty w danych wyjściowych Gson, ale .setDateFormat(DateFormat.FULL)
wydaje się , że nie działa i to samo z .registerTypeAdapter(Date.class, new DateSerializer())
.
To tak, jakby Gson nie dbał o obiekt „Data” i drukował go na swój sposób.
Jak mogę to zmienić?
Dzięki
EDYTOWAĆ:
@Entity
public class AdviceSheet {
public Date lastModif;
[...]
}
public void method {
Gson gson = new GsonBuilder().setDateFormat(DateFormat.LONG).create();
System.out.println(gson.toJson(adviceSheet);
}
Zawsze używam java.util.Date
; setDateFormat()
nie działa :(
Odpowiedzi:
Wydaje się, że musisz zdefiniować formaty dla części daty i godziny lub użyć formatowania opartego na łańcuchach. Na przykład:
lub używając java.text.DateFormat
lub zrób to z serializatorami:
Uważam, że formaterery nie mogą tworzyć znaczników czasu, ale ta para serializatora / deserializatora wydaje się działać
Jeśli używasz Java 8 lub nowszej wersji, powinieneś użyć powyższych serializatorów / deserializatorów:
źródło
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
działa.Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
działaPowyższy format wydaje mi się lepszy, ponieważ ma precyzję do milis.
źródło
Jak wskazał ML, JsonSerializer działa tutaj. Jeśli jednak formatujesz jednostki bazy danych, użyj java.sql.Date, aby zarejestrować swój serializator. Deserializer nie jest potrzebny.
Ten raport o błędzie może być powiązany: http://code.google.com/p/google-gson/issues/detail?id=230 . Używam jednak wersji 1.7.2.
źródło
Jeśli nie znosisz klas wewnętrznych, korzystając z funkcjonalnego interfejsu możesz napisać mniej kodu w Javie 8 z wyrażeniem lambda.
źródło
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, (JsonDeserializer) (json, typeOfT, context) -> new Date(json.getAsLong())).create();
To tak naprawdę nie zadziała. W JSON nie ma typu daty. Polecam serializację do ISO8601 tam iz powrotem (dla agnostyki formatów i kompatybilności z JS). Weź pod uwagę, że musisz wiedzieć, które pola zawierają daty.
źródło
Możesz określić format
Gson gson = builder.setDateFormat("yyyy-MM-dd").create();
w tej metodzie zamiastyyyy-MM-dd
używać innych formatówźródło
To jest błąd . Obecnie musisz albo ustawić
timeStyle
albo, albo użyć jednej z alternatyw opisanych w innych odpowiedziach.źródło
Korzystam z Gson 2.8.6 i dzisiaj odkryłem ten błąd.
Moje podejście pozwala wszystkim naszym obecnym klientom (mobilnym / internetowym / etc) dalej funkcjonować tak, jak oni, ale dodaje obsługę dla tych, którzy używają formatów 24-godzinnych, a także pozwala milis, na dokładkę.
Utrzymałem serializację taką samą, ponieważ wszyscy klienci rozumieją standardowy format daty JSON.
Zwykle nie sądzę, aby dobrą praktyką było używanie bloków try / catch, ale powinien to być dość rzadki przypadek.
źródło