GSON LocalDateTime

Fohnbit

Top Contributor
Hallo,

ich versuche eine Klasse mit einer LocalDateTime Variable zu serialisieren und dann wieder deserialisieren.
Wo habe ich meinen Fehler?

Bekomme aber immer den Error:
java.time.format.DateTimeParseException: Text '18::Mai::2021 11::33::37' could not be parsed at index 4
at energy.csv.LocalDateTimeDeserializer.deserialize(LocalDateTimeDeserializer.java:17)


[CODE lang="java" title="Main Klasse"]private class jsonTest {
private Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX").enableComplexMapKeySerialization()
.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeSerializer())
.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeDeserializer()).setPrettyPrinting().create();
private Values values = new Values();

...

String gs = gson.toJson(values);

...

values = gson.fromJson(gs, Values.class);
}

public class Values {
public HashMap<LocalDateTime, Value> values = new HashMap<LocalDateTime, Value>();
public HashMap<Integer, String> names = new HashMap<Integer, String>();
}

public class Value {
public HashMap<Integer, Double> value = new HashMap<Integer, Double>();
}

class LocalDateTimeSerializer implements JsonSerializer<LocalDateTime> {
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d::MMM::uuuu HH::mm::ss");

@Override
public JsonElement serialize(LocalDateTime localDateTime, Type srcType, JsonSerializationContext context) {
return new JsonPrimitive(formatter.format(localDateTime));
}
}

class LocalDateTimeDeserializer implements JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
return LocalDateTime.parse(json.getAsString(),
DateTimeFormatter.ofPattern("d::MMM::uuuu HH::mm::ss").withLocale(Locale.ENGLISH));
}
}[/CODE]
 

Neumi5694

Top Contributor
Das heißt, dass dein Parser mit "Mai" nichts anfangen kann.
Dein Serializer und Deserializer verwenden verschiedene Locale.

Empfehlung: Pack beide in eine Klasse und verwende einen gemeinsamen DateTimeFormatter.
 

mrBrown

Super-Moderator
Mitarbeiter
Oder setz für beide DateTimeFormatter das/den/die Locale, aktuell setzt du's für den Deserializer, und beim Serializer bleibt's der Default (was bei dir wohl Deutsch ist)
 

Ähnliche Java Themen

Neue Themen


Oben