jackson Mapping - Problem mit Zeitzonen

klaus1

Aktives Mitglied
Hallo,

ich versuche mit jackson ein JSON Objekt auf einen Calendar zu bringen.
Ein Property kommt so daher im json:
zuletztAngemeldet: "2021-04-30T08:24:48.943"

ich mappe dann so:
[CODE lang="java" title="jackson mapper"] ObjectMapper mapper = new ObjectMapper().configure(
org.codehaus.jackson.map.DeserializationConfig.Feature.USE_ANNOTATIONS, false).configure(
org.codehaus.jackson.map.SerializationConfig.Feature.USE_ANNOTATIONS, false).configure(
org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

List<MyObject> ref = mapper.readValue(jsonString, new TypeReference<List<MyObject>>() {
});
[/CODE]

Problem: Ich bekomme das java.util.Calendar Objekt mit dem Wert um 2h später also 10:24 Uhr.
Wie bekomm ich das in den Griff ? Zur not auch das eine Propery manuell mappen.
wäre vielleicht so möglich:
[CODE lang="java" title="explicit mapping"] if (!json.isNull("zuletztAngemeldet")) {
code.setAnmeldeDatum(DateTime.parse(json.getString("zuletztAngemeldet"),
DateTimeFormat.forPattern(DATE_PATTERN)).toGregorianCalendar());
}
[/CODE]
oder es liegt an der Zeitzone..
Leider bin ich an die Version 1.5 gebunden (Websphere).

danke,
 
hi! danke,
würde prinzipiell funktionieren mit dem Code snippet hier:
[CODE lang="java" title="jackson with timezone"]
private static final String dateFormat1 = "yyyy-MM-dd'T'HH:mm:ss";
SimpleDateFormat dateFormat = new SimpleDateFormat(dateFormat1);
dateFormat.setTimeZone(TimeZone.getTimeZone("CET"));

ObjectMapper mapper = new ObjectMapper().configure(
org.codehaus.jackson.map.DeserializationConfig.Feature.USE_ANNOTATIONS, false).configure(
org.codehaus.jackson.map.SerializationConfig.Feature.USE_ANNOTATIONS, false).configure(
org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
DeserializationConfig deserializationConfig = mapper.getDeserializationConfig();

deserializationConfig.setDateFormat(dateFormat);
mapper.setDeserializationConfig(deserializationConfig);

List<MyObject> ref = mapper.readValue(jsonString, new TypeReference<List<MyObject>>() {
});
[/CODE]

Die Timezone kann ich nur anwenden, wenn ich das DateFormat einschränke.
Leider wird natürlich jedes Datum gleich interpretiert.

Fehler:
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Calendar from String value '1990-04-03': not a valid representation (error: Unparseable date: "1990-04-03")
 
ja leider bin in dem Model abhängig. ist ein java.util.Calendar
Und im Model muss das auch verwendet werden?

Kann man u.U. an der Schnittstelle ansetzen und dort die neue Time-API nutzen? Dann hast du immerhin an der Schnittstelle saubere Typen, die kann man dann selbst passend auf den Malender-Typ mappen, so wie man es dann jeweils braucht. Das würde es schon mal deutlich einfacher machen, als Calender für alles zu nutzen.


EDIT: mit Version 1.5 allerdings potentiell schwierig, die ist ja 11 Jahre alt... Joda Time könnte dann die Alternative sein.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben