it-swarm.com.de

com.google.gson.JsonSyntaxException, wenn versucht wird, Datum/Uhrzeit in Json zu analysieren

Ich verwende RestTemplete, um Json-Daten von einer Rest-API zu erhalten, und ich verwende Gson, um Daten vom Json-Format in Object zu analysieren

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));

aber ich bekomme dieses problem mit date, was soll ich tun .. 

Could not read JSON: 1382828400000; nested exception is com.google.gson.JsonSyntaxException: 1382828400000

mein Pojo, das andere Pojos enthält

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;
    }

dies ist der Json, der von meiner API zurückgegeben wird 

[
   {
       "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"
       }
   },
  .....
]
13
Noureddine

Was ich schließlich getan habe, ist mein API-Projekt und einen CustomSerializer zu erstellen 

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);
    }
}

das gibt das Format jjjj-MM-dd zurück und ich habe Datumsfelder mit kommentiert

@JsonSerialize(using = CustomDateSerializer.class)

in meiner Android-Anwendung habe ich Gson-Objekt als erstellt 

            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();

und es funktioniert erstmal .. danke für eure hilfe ich schätze es

6
Noureddine

Benutzerdefinierte Serialisierer sind nicht mehr erforderlich. Verwenden Sie einfach GsonBuilder und geben Sie das Datumsformat als solches an:

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);
9
DiscDev

Der 1382828400000-Wert ist lang (Zeit in Millisekunden). Sie sagen GSON, dass das Feld eine Date ist, und es kann eine long nicht automatisch in eine Date konvertiert werden. 

Sie müssen Ihre Felder als lange Werte angeben

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

nachdem GSON den JSON-String in die gewünschte Klasseninstanz Appel umgewandelt hat, konstruieren Sie ein anderes Objekt mit diesen Feldern als Datumsangaben und konvertieren sie, während Sie dem neuen Objekt die Werte zuweisen.

Eine weitere Alternative ist die Implementierung eines eigenen benutzerdefinierten Deserializers:

 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();
     }
 }

Sie müssen diesen benutzerdefinierten Deserializer in den gewünschten Feldern und in den Setter-Methoden einstellen, z.

@JsonDeserialize(using=CustomDateDeserializer.class)
public void setDateParution(Date dateParution) {
    this.dateParution = dateParution;
}
0
Raul Rene