All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ph.com.nightowlstudios.entity.serializer.LocalDateTimeDeserializer Maven / Gradle / Ivy

There is a newer version: 6.21.1
Show newest version
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()); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy