2016-04-20 5 views
1

folgenden Ausschnitt stürzt mit Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRINGUm von json stürzt sofort

GsonBuilder gsonBuilder = new GsonBuilder(); 
Gson gson = gsonBuilder.create(); 
String jsonObjString = gson.toJson(customClassInstance, MyCustomClass.class); 
gson.fromJson(jsonObjString, MyCustomClass.class); // Crashes here 

Warum JSon? Wenn ich das jsonObjString drucke, scheint es in Ordnung.
Und die Codierung/Decodierung scheint richtig. Was ist das Problem?

Update:

public class MyCustomClass { 

    @SerializedName(“customer_city”) 
    private String customerCity; 

    @SerializedName(“customer_id”) 
    private String customerId; 

    private LocalDate entry; 

    @SerializedName(“customer_income”) 
    private double customerIncome; 

    private String[] cards; 


    @SerializedName(“customer_name") 
    private String customerName; 

} 
+0

was bedeutet u von "Absturz"? ist es eine Ausnahme, wenn ja, bitte posten Sie das auch. –

+0

Es ist wahrscheinlich ein Konflikt zwischen JsonString und der Java-Klasse. – Jagrut

+0

@RamanShrivastava: Die Ausnahme ist in der OP – Jim

Antwort

1

Ihre LocalDate erfordert eine deterministische Art und Weise von der Serialisierung und Deserialisierung es. Dazu müssen Sie einen benutzerdefinierten Adapter in Ihrer Gson Instanz registrieren.

public class LocalDateAdapter extends TypeAdapter<LocalDate> { 
    public LocalDate read(JsonReader reader) throws IOException { 
     if (reader.peek() == JsonToken.NULL) { 
     reader.nextNull(); 
     return null; 
     } 
     String xy = reader.nextString(); 
     return new LocalDate(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(xy); 
    } 
    public void write(JsonWriter writer, LocalDate value) throws IOException { 
     if (value == null) { 
     writer.nullValue(); 
     return; 
     } 
     String xy = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(value.getTime()); 
     writer.value(xy); 
    } 
    } 

Sie brauchen so etwas, obwohl ich über die API von LocalDate nicht ganz sicher bin.

Dann registrieren Sie es zu Ihrer Gson Instanz

Gson gson = new GsonBuilder() 
    .registerTypeAdapter(LocalDate.class, new LocalDateAdapter()) 
    .create(); 
+0

(auch erwähnenswert Sie sollten es wahrscheinlich als "long" anstatt als String speichern, damit Sie keine Probleme mit Zeitzonen haben.) – EpicPandaForce

Verwandte Themen