web-dev-qa-db-fra.com

Désérialiser avec des valeurs gson et null

J'essaie de désérialiser ma propre classe avec une valeur nulle. Mais mon code ne fonctionne pas.

Mon json:

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

Dans ma méthode, je fais ce qui suit:

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

Je ne désérialise pas tout l'objet, car il peut aussi y avoir un List<T>.

L'erreur:

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

Tout d'abord, vous devez savoir comment analyser en utilisant gson. Vous pouvez trouver des exemples ici .

Maintenant que vous savez analyser, vous pouvez toujours avoir un problème avec les valeurs NULL. Pour le résoudre, vous devez dire à gson de (dés) sérialiser null en utilisant

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

À partir de serializeNulls()doc _

Configurez Gson pour sérialiser les champs nuls. Par défaut, Gson omet tous les champs nuls lors de la sérialisation.

EDIT (Non testé, basé sur la doc)

Pour obtenir une valeur distincte, vous pouvez faire

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

Sinon si vous avez ce pojo

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

    @SerializedName("Title")
    private String title;

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

vous pouvez analyser en utilisant

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

J'ai eu un problème similaire (une exception générée sur la valeur null) avec le POJO suivant:

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

et ce code:

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

lorsque subEntry retourné par le serveur était null.

Je l'ai corrigé en changeant le type de subEntry de JsonObject à JsonElement qui est une classe parente de JsonObject et JsonNull, afin de permettre la désérialisation des valeurs null.

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

Pour vérifier ultérieurement la valeur null au moment de l'exécution, procédez comme suit:

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