com.google.gson.JsonSyntaxException quando si tenta di analizzare Data / Ora in json

Sto utilizzando RestTemplete per get i dati json da un rest api e sto utilizzando Gson per analizzare i dati dal formato json a Object

Gson gson = new Gson(); restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new GsonHttpMessageConverter()); restTemplate.getMessageConverters().add(new StringHttpMessageConverter()); List<Appel> resultList = null; resultList = Arrays.asList(restTemplate.getForObject(urlService, Appel[].class)); 

ma ho questo problema con Data, cosa devo fare.

  • Abilitazione di WiFi sull'emulatore Android
  • Utilizzo dell'istruzione switch per fare clic sui pulsanti di handle
  • Schede di Android Actionbar e Focus di tastiera
  • Registrazione dell'audio stereo con un Motorola Moto G (o Moto X)
  • Android: Come misurare l'altezza totale di ListView
  • Conversione di PDF in image (con formattazione corretta)
  •  Could not read JSON: 1382828400000; nested exception is com.google.gson.JsonSyntaxException: 1382828400000 

    il mio Pojo che contiene altri pojos nel suo corpo

     public class Appel implements Serializable { private Integer numOrdre; private String reference; private String objet; private String organisme; private Double budget; private Double caution; private Date dateParution; private Date heureParution; private Date dateLimite; private Date heureLimite; private List<Support> supportList; private Ville villeid; private Categorie categorieid; public Appel() { } public Appel(Integer numOrdre, String reference, String objet, String organisme, Date dateParution, Date heureParution, Date dateLimite) { this.numOrdre = numOrdre; this.reference = reference; this.objet = objet; this.organisme = organisme; this.dateParution = dateParution; this.heureParution = heureParution; this.dateLimite = dateLimite; } 

    questo è il json restituito dalla mia API

     [ { "numOrdre": 918272, "reference": "some text", "objet": "some text", "organisme": "some text", "budget": 3000000, "caution": 3000000, "dateParution": 1382828400000, "heureParution": 59400000, "dateLimite": 1389657600000, "heureLimite": 34200000, "supportList": [ { "id": 1, "nom": "some text", "dateSupport": 1384732800000, "pgCol": "013/01" }, { "id": 2, "nom": "some text", "dateSupport": 1380236400000, "pgCol": "011/01" } ], "villeid": { "id": 2, "nom": "Ville", "paysid": { "id": 1, "nom": "Pays" } }, "categorieid": { "id": 1, "description": "some text" } }, ..... ] 

  • Cambiare la luminosità dello schermo in modo programmato (come con il widget di potenza)
  • Client TCP \ IP - EHOSTUNREACH (nessun path per l'host)
  • Controllare l'icona dell'allarme nella barra di stato
  • Come aspettare che un thread finisca prima che un altro thread inizia in Java / Android?
  • Android, Twitter, 'FOLLOW US'
  • Lucky patcher, come posso proteggere da essa?
  • 3 Solutions collect form web for “com.google.gson.JsonSyntaxException quando si tenta di analizzare Data / Ora in json”

    I serializzatori personalizzati non sono più necessari: semplicemente utilizzare GsonBuilder e specificare il formato della data, in quanto tale:

     Timestamp t = new Timestamp(System.currentTimeMillis()); String json = new GsonBuilder() .setDateFormat("yyyy-MM-dd hh:mm:ss.S") .create() .toJson(t); System.out.println(json); 

    Quello che ho fatto finalmente è andare al mio progetto API e creare un CustomSerializer

     public class CustomDateSerializer extends JsonSerializer<Date> { @Override public void serialize(Date t, JsonGenerator jg, SerializerProvider sp) throws IOException, JsonProcessingException { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); String formattedDate = formatter.format(t); jg.writeString(formattedDate); } } 

    che restituiscono il formato yyyy-MM-dd e ho annotato i campi di date con

     @JsonSerialize(using = CustomDateSerializer.class) 

    nella mia applicazione Android ho creato l'object Gson come

      Reader reader = new InputStreamReader(content); GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.setDateFormat("yyyy-MM-dd"); Gson gson = gsonBuilder.create(); appels = Arrays.asList(gson.fromJson(reader, Appel[].class)); content.close(); 

    e funziona per ora .. grazie per il tuo aiuto lo apprezzo

    Il valore 1382828400000 è lungo (tempo in millisecondi). GSON a GSON che il field è una Date e non può convertire automaticamente un long in una Date .

    Devi specificare i campi come valori lunghi

     private long dateParution; private long heureParution; private long dateLimite; private long heureLimite; 

    e dopo che GSON lancia la string JSON all'istanza di class Appel desiderata, costruisci un altro object con tali campi come Date e li converte durante l'assegnazione dei valori al nuovo object.

    Un'altra alternativa è implementare il proprio Deserializer personalizzato:

      public class CustomDateDeserializer extends DateDeserializer { @Override public Date deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException { // get the value from the JSON long timeInMilliseconds = Long.parseLong(jsonParser.getText()); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(timeInMilliseconds); return calendar.getTime(); } } 

    Devi impostare questo deserializzatore personalizzato nei campi desiderati, sui methods di setter, come:

     @JsonDeserialize(using=CustomDateDeserializer.class) public void setDateParution(Date dateParution) { this.dateParution = dateParution; } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.