web-dev-qa-db-fra.com

Comment désérialiser la date JS avec Jackson?

Je reçois une chaîne de date d'ExtJS au format:

"2011-04-08T09: 00: 00"

lorsque j'essaie de désérialiser cette date, le fuseau horaire est remplacé par l'heure standard indienne (ajoute +5: 30 à l'heure). Voici comment je désérialise la date:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);

Cela ne change pas non plus le fuseau horaire. J'ai toujours la date dans IST:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);

Comment désérialiser la date de la manière dont elle vient sans les tracas du fuseau horaire?

66
Varun Achar

J'ai trouvé un moyen de contourner le problème, mais il me faudra annoter le paramètre de chaque date tout au long du projet. Existe-t-il un moyen de spécifier le format lors de la création de ObjectMapper?

Voici ce que j'ai fait:

public class CustomJsonDateDeserializer extends JsonDeserializer<Date>
{
    @Override
    public Date deserialize(JsonParser jsonParser,
            DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        String date = jsonParser.getText();
        try {
            return format.parse(date);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }

    }

}

Et annoté la méthode de définition de chaque champ Date avec ceci:

@JsonDeserialize(using = CustomJsonDateDeserializer.class)
133
Varun Achar

Cela fonctionne pour moi - j'utilise jackson 2.0.4

ObjectMapper objectMapper = new ObjectMapper();
final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
objectMapper.setDateFormat(df);
54
Balaji Natesan

Il existe un bon blog sur ce sujet: http://www.baeldung.com/jackson-serialize-dates Utiliser @JsonFormat semble le moyen le plus simple.

public class Event {
    public String name;

    @JsonFormat
      (shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
    public Date eventDate;
}
13
wangf

En plus de réponse de Varun Achar , il s'agit de la variante Java 8 que j'ai proposée), qui utilise Java.time.LocalDate et ZonedDateTime au lieu de l'ancien Java.util. Classes de date.

public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {

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

        String string = jsonparser.getText();

        if(string.length() > 20) {
            ZonedDateTime zonedDateTime = ZonedDateTime.parse(string);
            return zonedDateTime.toLocalDate();
        }

        return LocalDate.parse(string);
    }
  }
6
Tim Büthe