J'essaie de convertir un fichier JSON présent dans un fichier en objet Java en utilisant ObjectMapper.Différentes sorties utilisant ObjectMapper 'setDateFormat' et désérialiseur de date personnalisé utilisant @JsonDeserialize
fichier JSON: échantillon date str.json
{
"eventDate"="2017-06-27 10:04:26.573503+05:30"
}
Java POJO: SampleDatePOJO
class SampleDatePOJO{
private Date eventDate;
getter and setter....
toString...
}
code Java pour convertir JSON objet Java:
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSX")); //this will convert Date to IST format which is okay.
SampleDatePOJO sampleDatePOJO = mapper.readValue(new File("sample-date-str.json"), SampleDatePOJO.class);
System.out.println(sampleDatePOJO.getEventDate()); //this gives output "Tue
Jun 27 10:43:59 IST 2017"
Remarque: Si je supprime mapper.setDateFormat (..) et utilise @JsonFormat (pattern = "aaaa-MM-jj HH: mm: ss.SSSSSSX", timezone = "IST") sur le champ 'eventDate' donne la même sortie.
code Java pour la coutume Deserilaizer
public class CustomDateDeserializer extends JsonDeserializer<Date>{
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSXXX");
Date dateTmp = null;
try {
dateTmp = sdf.parse(p.getValueAsString());
} catch (ParseException e) {
e.printStackTrace();
}
return dateTmp;
}
}
Si j'utilise l'annotation d'annotation @JsonDeserialize ci-dessus champ 'EVENTDATE' comme:
@JsonDeserialize(using=CustomDateDeserializer.class)
La sortie reçu est:
System.out.println(sampleDatePOJO.getEventDate()); //"Tue Jun 27 10:13:59 IST 2017"
qui est correct que la partie milliseconde "573503" est ajoutée à la date.
Je dois comprendre pourquoi mon ObjectMapper setDateFormat et @JsonFormat ne fonctionnent pas. Ou s'ils fonctionnent bien pourquoi il y a une différence dans la sortie avec le même format SimpeDateFormat. Toute aide est grandement appréciée.
Mais pourquoi voulez-vous percevoir le 573503 en millisecondes? N'étaient-ils pas prévus en microsecondes (millionièmes de secondes) de l'autre côté? En relation: [java.text.ParseException: Date impossible: aaaa-MM-jj HH: mm: ss.SSSSSS] (https://stackoverflow.com/questions/8607809/java-text-parseexception-unparseable-date-yyyy- mm-dd-hhmmss-ssssss). –
Jetez un coup d'œil à ['SimpleDateFormat' javadoc] (https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html#iso8601timezone): ** si le motif est" X " et le fuseau horaire est "GMT + 05: 30", "+05" est produit **. Avec seulement un 'X', les 30 minutes dans l'offset sont ignorées et' SimpleDateFormat' désactive tout. Aussi, comme @ OleV.V. dit dans le commentaire ci-dessus, êtes-vous sûr que vous voulez vraiment considérer 573503 comme millisecondes et l'ajouter à la date? Cela ne semble pas l'approche la plus correcte, car tout après la virgule décimale doit être considéré comme les fractions de la seconde. –