Jak zmusić Jacksona do serializacji mojego obiektu Joda DateTime zgodnie z prostym wzorcem (np. „Dd-MM-yyyy”)?
Próbowałem:
@JsonSerialize(using=DateTimeSerializer.class)
private final DateTime date;
Próbowałem też:
ObjectMapper mapper = new ObjectMapper()
.getSerializationConfig()
.setDateFormat(df);
Dzięki!
Odpowiedzi:
Stało się to bardzo łatwe dzięki Jacksonowi 2.0 i modułowi Joda.
Zależność Mavena:
Kod i dokumentacja: https://github.com/FasterXML/jackson-datatype-joda
Pliki binarne: http://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-joda/
źródło
W obiekcie, który mapujesz:
W CustomDateSerializer:
źródło
org.codehaus.jackson
zamiastcom.fasterxml.jackson.core
. Korzystanie z drugiego pakietu nie działa dla mnie. W rzeczywistości moja aplikacja Jersey nawet nie respektowała@JsonSerialized
adnotacji.Jak powiedział @Kimble, w przypadku Jackson 2 użycie domyślnego formatowania jest bardzo łatwe; po prostu zarejestruj się
JodaModule
na swoimObjectMapper
.W przypadku niestandardowej serializacji / deserializacji programu
DateTime
należy zaimplementować własneStdScalarSerializer
iStdScalarDeserializer
; jest to dość zawiłe, ale i tak.Na przykład, oto
DateTime
serializator, który używaISODateFormat
ze strefą czasową UTC:I odpowiedni desserializator:
Następnie połącz je razem z modułem:
Następnie zarejestruj moduł na swoim
ObjectMapper
:źródło
Proste rozwiązanie
Napotkałem podobny problem i moje rozwiązanie jest znacznie jasne niż powyżej.
Po prostu użyłem wzorca w
@JsonFormat
adnotacjiZasadniczo moja klasa ma
DateTime
pole, więc umieściłem adnotację wokół gettera:Serializuję klasę z
ObjectMapper
Używamy Jackson 2.5.4
źródło
https://stackoverflow.com/a/10835114/1113510
Chociaż możesz umieścić adnotację dla każdego pola daty, lepiej jest wykonać globalną konfigurację dla programu mapowania obiektów. Jeśli używasz jacksona, możesz skonfigurować swoją sprężynę w następujący sposób:
W przypadku CustomObjectMapper:
Oczywiście SimpleDateFormat może używać dowolnego formatu.
źródło
setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz"));
W międzyczasie Jackson automatycznie rejestruje moduł Joda, gdy JodaModule znajduje się w ścieżce klas. Właśnie dodałem jackson-datatype-joda do Mavena i zadziałało natychmiast.
Wyjście JSON:
źródło
Dla tych z Spring Boot musisz dodać moduł do swojego kontekstu i zostanie dodany do twojej konfiguracji w ten sposób.
A jeśli chcesz użyć nowego modułu czasu java8 jsr-310.
źródło
Wygląda na to, że w przypadku Jacksona 1.9.12 domyślnie nie ma takiej możliwości, ponieważ:
Ta klasa serializuje dane przy użyciu metody toString () Joda DateTime.
Podejście zaproponowane przez Rusty'ego Kuntza sprawdza się idealnie w moim przypadku.
źródło
Używam Java 8 i to zadziałało.
Dodaj zależność od
pom.xml
i dodaj JodaModule do swojego
ObjectMapper
źródło