2017-08-28 2 views
-1

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.

+1

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). –

+1

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. –

Répondre

2

Avez-vous remarqué, Dans les deux premières conversions que vous utilisez X(yyyy-MM-dd HH:mm:ss.SSSSSSX) en modèle de date unique. Mais dans le dé-traiteur personnalisé, vous utilisez XXX(yyyy-MM-dd HH:mm:ss.SSSSSSXXX).

Cette différence de motif cause en fait toute la différence (la différence de 30 minutes). Si vous utilisez le même modèle à travers un mécanisme différent, la sortie restera également la même.