I am trying to deserialize my own class with a null value. But my code doesn't work.
My json:
{"Text":null,"Code":0,"Title":"This is Sparta!"}
In my method I do the following:
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))
I am not deserialize the whole object, because there can be a List<T>
, too.
The error:
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)
First, you must read about how to parse using gson. You can find some example here.
Now you know how to parse, you can still have problem with null values. To solve it you must tell gson to (de)serialize null
using
Gson gson = new GsonBuilder().serializeNulls().create();
From the serializeNulls()
doc
Configure Gson to serialize null fields. By default, Gson omits all fields that are null during serialization.
EDIT (Not tested, based on doc)
In order to get some distinct value you can do
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();
Otherwise if you have this pojo
public class MyElement {
@SerializedName("Text")
private String text;
@SerializedName("Title")
private String title;
@SerializedName("Code")
private int code;
}
you can parse using
String json = ""; //Your json has a String
Gson gson = new GsonBuilder().serializeNulls().create();
MyElement myElement = gson.fromJson(json, MyElement.class);
I had a similar problem (an exception thrown on null
value) with the following POJO:
public class MyElement {
private String something;
private String somethingElse;
private JsonObject subEntry; // this doesn't allow deserialization of `null`!
}
and this code:
parsedJson = gson.fromJson(json, MyElement.class)
when subEntry
returned by the backend was null
.
I fixed it by changing the type of subEntry
from JsonObject
to JsonElement
which is a parent class of both JsonObject
and JsonNull
, to allow deserialization of null
values.
public class MyElement {
private String something;
private String somethingElse;
private JsonElement subEntry; // this allows deserialization of `null`
}
To later check for null at runtime, you'd do as follows:
if (parsedJson.subEntry instanceof JsonNull) {
...
} else {
...
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With