2015-10-30 6 views
7

Ich versuche, meine eigene Klasse mit einem Nullwert deserialisieren. Aber mein Code funktioniert nicht.Deserialize mit Gson und Nullwert

Mein json:

{"Text":null,"Code":0,"Title":"This is Sparta!"} 

In meiner Methode, die ich wie folgt vor:

this.setText(gson.fromJson(jsonObject.getString("Text"), String.class)); 
this.setTitle(gson.fromJson(jsonObject.getString("Title"), String.class)); 
this.setCode(gson.fromJson(jsonObject.getString("Faccode"), Integer.class)) 

Ich bin nicht das ganze Objekt deserialisieren, denn es kann eine List<T> sein, auch.

Der Fehler:

myapp W/System.err? com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 6 path $ 
myapp W/System.err? at com.google.gson.Gson.assertFullConsumption(Gson.java:786) 
myapp W/System.err? at com.google.gson.Gson.fromJson(Gson.java:776) 
myapp W/System.err? at com.google.gson.Gson.fromJson(Gson.java:724) 
myapp W/System.err? at com.google.gson.Gson.fromJson(Gson.java:696) 
+0

Was ist Ihr Fehler? – ThomasThiebaud

+1

Sie müssen zuerst über das Parsen mit Gson lesen –

+0

Können Sie die Lösung aus Ihrer Frage entfernen und es als eine richtige Antwort einreichen? (Leicht verwandt mit Meta Frage http://meta.stackoverflow.com/q/309266/2564301) – usr2564301

Antwort

14

Zuerst müssen Sie lesen, wie mit Gson zu analysieren. Sie können ein Beispiel finden here.

Jetzt wissen Sie, wie zu analysieren, können Sie immer noch Probleme mit NULL-Werte haben können. Um es zu lösen, müssen Sie sagen Gson (de) Serialisierung null

Gson gson = new GsonBuilder().serializeNulls().create(); 

Vom serializeNulls()doc

Configure Gson to serialize null fields. By default, Gson omits all fields that are null during serialization.

EDIT mit (nicht getestet, basierend auf doc)

Um zu einige deutliche Wert erhalten Sie tun können,

String json = ""; //Your json has a String 
JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject(); 

//If null, use a default value 
JsonElement nullableText = jsonObject.get("Text"); 
String text = (nullableText instanceof JsonNull) ? "" : nullableText.getAsString(); 

String title = jsonObject.get("Title").toString(); 
int code = jsonObject.get("Code").getAsInt(); 

Andernfalls, wenn Sie dieses pojo haben

public class MyElement { 
    @SerializedName("Text") 
    private String text; 

    @SerializedName("Title") 
    private String title; 

    @SerializedName("Code") 
    private int code; 
} 

Sie können

String json = ""; //Your json has a String 
Gson gson = new GsonBuilder().serializeNulls().create(); 
MyElement myElement = gson.fromJson(json, MyElement.class); 
+1

Ich habe jetzt viel gelesen. Und ich habe Gson gson = new GsonBuilder() ausprobiert.serializeNulls(). create(); auch. Aber ich habe es nicht verstanden. Wie muss ich es richtig analysieren? Und das Problem ist nicht bei der Serialisierung, aber in DEserializing – BHuelse

+0

habe ich meine Antwort bearbeitet. Ich hoffe, es wird helfen. Sonst kannst du mehr Details liefern? – ThomasThiebaud

+0

Jetzt funktioniert es. Ich habe auch den JsonParser benutzt. Aber ich habe JSONObject anstelle von JsonObject aus altem Code. – BHuelse

0

Ich hatte ein ähnliches Problem (eine Ausnahme geworfen auf null Wert) mit dem folgenden POJO verwenden analysieren:

public class MyElement { 
    private String something; 
    private String somethingElse; 
    private JsonObject subEntry; // this doesn't allow deserialization of `null`! 
} 

und dieser Code:

wenn subEntry vom Backend zurückgekehrt war null.

ich es fixierte, indem die Art des subEntry aus JsonObject zu JsonElement ändert, die sowohl eine übergeordnete Klasse von JsonObject und JsonNull, Deserialisierung von null Werten zu ermöglichen.

public class MyElement { 
    private String something; 
    private String somethingElse; 
    private JsonElement subEntry; // this allows deserialization of `null` 
} 

Um spätere Überprüfung auf null zur Laufzeit, würde tun Sie wie folgt vor:

if (parsedJson.subEntry instanceof JsonNull) { 
    ... 
} else { 
    ... 
} 
+0

Siehe auch [diese Antwort] (https://stackoverflow.com/questions/12379405/cant-cast-jsonnull-to-jsonobject) –