ph.com.nightowlstudios.entity.serializer.LocalDateTimeDeserializer Maven / Gradle / Ivy
Show all versions of edge Show documentation
package ph.com.nightowlstudios.entity.serializer;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import io.vavr.control.Try;
import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
/**
* @author Joseph Harvey Angeles - yev
* @since 4/10/21
**/
public class LocalDateTimeDeserializer extends StdDeserializer {
protected LocalDateTimeDeserializer() {
this(LocalDateTime.class);
}
protected LocalDateTimeDeserializer(Class> vc) {
super(vc);
}
/**
* Method that can be called to ask implementation to deserialize
* JSON content into the value type this serializer handles.
* Returned instance is to be constructed by method itself.
*
* Pre-condition for this method is that the parser points to the
* first event that is part of value to deserializer (and which
* is never JSON 'null' literal, more on this below): for simple
* types it may be the only value; and for structured types the
* Object start marker or a FIELD_NAME.
*
*
* The two possible input conditions for structured types result
* from polymorphism via fields. In the ordinary case, Jackson
* calls this method when it has encountered an OBJECT_START,
* and the method implementation must advance to the next token to
* see the first field name. If the application configures
* polymorphism via a field, then the object looks like the following.
*
* {
* "@class": "class name",
* ...
* }
*
* Jackson consumes the two tokens (the @class field name
* and its value) in order to learn the class and select the deserializer.
* Thus, the stream is pointing to the FIELD_NAME for the first field
* after the @class. Thus, if you want your method to work correctly
* both with and without polymorphism, you must begin your method with:
*
* if (p.currentToken() == JsonToken.START_OBJECT) {
* p.nextToken();
* }
*
* This results in the stream pointing to the field name, so that
* the two conditions align.
*
* Post-condition is that the parser will point to the last
* event that is part of deserialized value (or in case deserialization
* fails, event that was not recognized or usable, which may be
* the same event as the one it pointed to upon call).
*
* Note that this method is never called for JSON null literal,
* and thus deserializers need (and should) not check for it.
*
* @param p Parsed used for reading JSON content
* @param ctxt Context that can be used to access information about
* this deserialization activity.
* @return Deserialized value
*/
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
try {
Instant instant = Instant.ofEpochSecond(Long.parseLong(p.getText()));
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
} catch (NumberFormatException e) {
return LocalDateTime.parse(p.getText());
}
}
}