@Override
 public Date deserialize(
     final JsonParser jsonParser, final DeserializationContext deserializationContext)
     throws IOException {
   final JsonToken token = jsonParser.getCurrentToken();
   switch (token) {
     case VALUE_NUMBER_FLOAT:
       return new Date(jsonParser.getDecimalValue().movePointRight(3).longValue());
     case VALUE_NUMBER_INT:
       return new Date(jsonParser.getLongValue() * 1000L);
     default:
       return new DateDeserializers.DateDeserializer()
           .deserialize(jsonParser, deserializationContext);
   }
 }
 /**
  * Method for copying contents of the current event that the given parser instance points to. Note
  * that the method <b>will not</b> copy any other events, such as events contained within Json
  * Array or Object structures.
  *
  * <p>Calling this method will not advance the given parser, although it may cause parser to
  * internally process more data (if it lazy loads contents of value events, for example)
  */
 @Override
 public void copyCurrentEvent(JsonParser jp) throws IOException, JsonProcessingException {
   switch (jp.getCurrentToken()) {
     case START_OBJECT:
       writeStartObject();
       break;
     case END_OBJECT:
       writeEndObject();
       break;
     case START_ARRAY:
       writeStartArray();
       break;
     case END_ARRAY:
       writeEndArray();
       break;
     case FIELD_NAME:
       writeFieldName(jp.getCurrentName());
       break;
     case VALUE_STRING:
       writeString(jp.getText());
       break;
     case VALUE_NUMBER_INT:
       switch (jp.getNumberType()) {
         case INT:
           writeNumber(jp.getIntValue());
           break;
         case BIG_INTEGER:
           writeNumber(jp.getBigIntegerValue());
           break;
         default:
           writeNumber(jp.getLongValue());
       }
       break;
     case VALUE_NUMBER_FLOAT:
       switch (jp.getNumberType()) {
         case BIG_DECIMAL:
           writeNumber(jp.getDecimalValue());
           break;
         case FLOAT:
           writeNumber(jp.getFloatValue());
           break;
         default:
           writeNumber(jp.getDoubleValue());
       }
       break;
     case VALUE_TRUE:
       writeBoolean(true);
       break;
     case VALUE_FALSE:
       writeBoolean(false);
       break;
     case VALUE_NULL:
       writeNull();
       break;
     case VALUE_EMBEDDED_OBJECT:
       writeObject(jp.getEmbeddedObject());
       break;
     default:
       throw new IllegalStateException();
   }
 }
 /**
  * Default unmarshal for BigDecimal.
  *
  * <p>Used in generated code via static imports method overload resolution by compiler.
  *
  * @param parser the parser
  * @param numberNull the BigDecimal null, always {@code null}
  * @param expectedClass the expected class
  * @return the BigDecimal
  * @throws IOException Signals that an I/O exception has occurred.
  */
 public static BigDecimal unmarshal(
     JsonParser parser, @Nullable BigDecimal numberNull, Class<?> expectedClass)
     throws IOException {
   return parser.getDecimalValue();
 }