Метка времени Джексона неверная десериализация - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть собственный объектный класс:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import org.codehaus.jackson.map.ObjectMapper;


public class CustomObjectMapper extends ObjectMapper {
public static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ";

public CustomObjectMapper() {
    DateFormat df = new SimpleDateFormat(DATE_FORMAT);
    this.setDateFormat(df);
}

и юнит-тест:

@Test
public void testSerialization() throws JsonParseException, JsonMappingException, IOException  {

    String timestamp = "2019-02-12T07:53:11+0000";
    CustomObjectMapper customObjectMapper = new CustomObjectMapper();
    Timestamp result = customObjectMapper.readValue(timestamp, Timestamp.class);
    System.out.println(result.getTime());

}

Тест джунит дает мне "2019".

Я пытался использовать customTimestampDeserializer:

public class CustomJsonTimestampDeserializer extends
    JsonDeserializer<Timestamp> {

@Override
public Timestamp deserialize(JsonParser jsonparser,
        DeserializationContext deserializationcontext) throws IOException,
        JsonProcessingException {

    String date = jsonparser.getText(); //date is "2019"
    JsonToken token = jsonparser.getCurrentToken(); // is JsonToken.VALUE_NUMBER_INT
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
            CustomObjectMapper.DATE_FORMAT);
    try {
        return new Timestamp(simpleDateFormat.parse(date).getTime());
    } catch (ParseException e) {

        return null;
    }
}

}

Что я не так делаю?Похоже, что Джексон думает, что строка метки времени является целым числом и прекращает ее анализ после 2019 года.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

С этим подходом связаны две проблемы.

Прежде всего, есть подозрительное утверждение импорта:

import org.codehaus.jackson.map.ObjectMapper;

org.codehaus является предшественником текущего com.fasterxml.Непонятно, было ли оно использовано намеренно, но импорт ObjectMapper должен быть

import com.fasterxml.jackson.databind.ObjectMapper;

Во-вторых, метка времени не может быть прочитана напрямую из простой строки, такой как

String timestamp = "2019-02-12T07:53:11+0000";

ObjectMapper ожидает строку JSON.Таким образом, если бы это были

{ "timestamp": "2019-02-12T07:53:11+0000" }

и класс обтекания

class TimestampWrapper {

  private Timestamp timestamp;
  // getter + setter for timestamp
}

, тогда тестовая последовательность будет выполнена правильно:

String timestamp = "{ \"timestamp\": \"2019-02-12T07:53:11+0000\" }";
CustomObjectMapper customObjectMapper = new CustomObjectMapper();
TimestampWrapper result = customObjectMapper.readValue(timestamp, TimestampWrapper.class);
System.out.println(result.getTimestamp());

update:

Или, без использования выделенного класса-оболочки, его можно десериализовать из массива JSON:

String timestamp = "[ \"2019-02-12T07:53:11+0000\" ]";
CustomObjectMapper customObjectMapper = new CustomObjectMapper();
Timestamp[] result = customObjectMapper.readValue(timestamp, Timestamp[].class);
System.out.println(result[0]);
0 голосов
/ 12 февраля 2019

Возможно, Джексон не распознает Timestamp как тип даты и поэтому не полагается на DateFormat

Можете ли вы попробовать использовать Java.util.Date вместо Timestamp?

...