2015-10-30 11 views
7

Sto tentando di deserializzare la mia classe con un valore nullo. Ma il mio codice non funziona.Deserialize con valori gson e null

mio JSON:

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

Nel mio metodo che effettuare le seguenti operazioni:

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

io non sto deserializzare l'intero oggetto, perché non ci può essere un List<T>, anche.

L'errore:

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

Qual è il suo errore? – ThomasThiebaud

+1

È necessario leggere prima l'analisi con GSON –

+0

È possibile rimuovere la soluzione dalla domanda e inviarla come risposta corretta? (Leggermente correlato alla domanda Meta http://meta.stackoverflow.com/q/309266/2564301) – usr2564301

risposta

14

In primo luogo, è necessario leggere su come analizzare utilizzando GSON. Puoi trovare qualche esempio here.

Ora sai come analizzare, puoi ancora avere problemi con valori nulli. Per risolverlo è necessario indicare GSON per (de) serializzare null utilizzando

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

Dal serializeNulls()doc

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

EDIT (non testato, in base a doc)

Al fine di ottieni un valore distinto che puoi fare

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

caso contrario, se si dispone di questo POJO

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

    @SerializedName("Title") 
    private String title; 

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

è possibile analizzare utilizzando

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

Ho letto molto, ora. E ho provato Gson Gson = new GsonBuilder().serializeNulls(). create() ;, anche. Ma non l'ho capito. Come devo analizzarlo correttamente? E il problema non è la serializzazione, ma in DEserializing – BHuelse

+0

ho modificato la mia risposta. Spero che sarà di aiuto. Altrimenti puoi fornire maggiori dettagli? – ThomasThiebaud

+0

Ora funziona. Ho usato anche JsonParser. Ma ho JSONObject al posto di JsonObject dal vecchio codice. – BHuelse

0

ho avuto un problema simile (un'eccezione gettato sul null valore) con il seguente POJO:

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

e questo codice:

parsedJson = gson.fromJson(json, MyElement.class) 

quando subEntry restituito dal back-end era null.

ho fissato cambiando il tipo di subEntry da JsonObject a JsonElement che è una classe principale di entrambe JsonObject e JsonNull, per consentire deserializzazione null valori.

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

per controllare più tardi per nulla in fase di esecuzione, si potrebbe procedere come segue:

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

Vedere anche [questa risposta] (https://stackoverflow.com/questions/12379405/cant-cast-jsonnull-to-jsonobject) –