2017-01-28 6 views
1

In meinem Java-Projekt gibt es eine GSO-Deserializer-Funktion, die den folgenden Fehler ergibt.java.lang.NumberFormatException: Für Eingabezeichenfolge: "2017-01-28 13:28:20"

java.lang.NumberFormatException: For input string: "2017-01-28 13:28:20" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Long.parseLong(Long.java:589) 
at java.lang.Long.parseLong(Long.java:631) 
at com.google.gson.JsonPrimitive.getAsLong(JsonPrimitive.java:238) 
at com.example.myproject.controller.MyController$1.deserialize(MyController.java:222) 
at com.example.myproject.controller.MyController$1.deserialize(MyController.java:1) 
at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58) 
at com.google.gson.internal.bind.TypeAdapters$22$1.read(TypeAdapters.java:526) 
at com.google.gson.internal.bind.TypeAdapters$22$1.read(TypeAdapters.java:524) 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93) 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172) 
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40) 
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81) 
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60) 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93) 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172) 
at com.google.gson.Gson.fromJson(Gson.java:803) 
at com.google.gson.Gson.fromJson(Gson.java:768) 
at com.google.gson.Gson.fromJson(Gson.java:717) 
at com.google.gson.Gson.fromJson(Gson.java:689) 

Ich erhalte diesen Fehler, wenn ich die folgende JSON-Zeichenfolge deserialize.

jsonString = {"repList":[{"createdOn":"2017-01-28 13:28:20","date":"2016-11-17 00:00:00","description":"","id":45,"userId":10}],"subList":[{"attachmentCount":0,"dateOn":"2017-01-28 13:28:20","id":86,"screenId":1,"sync":"1","repId":45,"userId":10}]} 

Unten ist meine Funktion, wo ich die Gson Deserialisierung getan habe.

SimpleDateFormat dtf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.ENGLISH); 
GsonBuilder builder = new GsonBuilder(); 
builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() { 

    @Override 
    public Date deserialize(JsonElement json, Type type, JsonDeserializationContext deserializationContext) throws JsonParseException { 

     String frStr = dtf.format(new Date(json.getAsJsonPrimitive().getAsLong())); 
     dtf.setTimeZone(TimeZone.getDefault()); 
     Date retDate =null; 
      try { 
       retDate = dtf.parse(frStr); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 
     return retDate; 
    } 
}); 
gson = builder.create(); 
MainAccounts mainAcc = gson.fromJson(jsonString, MainAccounts.class); 

Was ich die Ausnahme bemerkt kommt, wenn ich das json primitiv zu lange konvertieren, wie unter

json.getAsJsonPrimitive().getAsLong() 

innerhalb des deserialize method.How kann ich dieses Problem lösen? Bitte helfen Sie mir.

Antwort

4

Sie müssen verwenden, um direkt den Wert Ihrer JsonElement zu erhalten, wie es wirklich ist: ein String kein long durch Aufruf der Methode getAsString() sonst werden Sie eine NumberFormatException erhalten, wie Sie bereits bemerkt haben, so dass Ihr JsonDeserializer sollte eher:

new JsonDeserializer<Date>() { 
    private SimpleDateFormat dtf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    { 
     // Indicate the time zone of the input date 
     dtf.setTimeZone(TimeZone.getTimeZone("Asia/Dubai")); 
    } 
    @Override 
    public Date deserialize(JsonElement json, Type type, 
     JsonDeserializationContext deserializationContext) throws JsonParseException { 
     try { 
      // Get the json element as a String and parse it to get a Date 
      return dtf.parse(json.getAsString()); 
     } catch (ParseException e) { 
      // Throw a JsonParseException in case of a parsing error 
      throw new JsonParseException(e); 
     } 
    } 
} 

NB: da es die anonyme innere Klasse des Typs JsonDeserializer oben vorgeschlagen ist, wird wegen SimpleDateFormat nicht Thread-sicher, dass ist itslef eine Instanz davon so vermeiden nicht Thread-sicher zu teilen, c Erstellen Sie eine neue Instanz, wenn Sie Ihren JSON-Inhalt deserialisieren möchten.

+0

ok.its arbeitet jetzt.Also die oben genannten JSON Zeichenfolge kommt mit Datum Werte sind Entspricht der Zeitzone von Dubai, jetzt muss ich seine Zeitzone in Server umwandeln (das ist in Indien), also ändert sich der Datumswert in die indische Zeit. Wie kann ich das zusammen mit dem Format machen? – KJEjava48

+0

@ KJEjava48 was beim Parsen wichtig ist, ist die Eingabe-Zeitzone, da 'java.util.Date' zeitzonenunabhängig ist (es ist tatsächlich ein Zeitstempel in UTC), bitte [this] (http://stackoverflow.com/questions/) 1516213/is-java-util-date-using-timezone) für weitere Details. Siehe auch http://stackoverflow.com/questions/7670355/convert-date-time-for-given-timezone-java –

+1

AFAIR, 'SimpleDateFormat' ist nicht Thread-sicher. –

1

Ich nehme an, das Problem ist, dass der Wert keine Zeichenfolge ist, die eine lange darstellt, so dass Sie es nicht als solche analysieren können. Sie sollten wahrscheinlich String frStr = dtf.parse(json.getAsJsonPrimitivie().getAsString())

+0

Wenn ich den Wert von json.getAsJsonPrimitive() drucke dies ist der Wert, den ich habe "2017-01-28 13:28:20" – KJEjava48

Verwandte Themen