I'm dealing with an API that sends back integers (1=true, other=false) to represent booleans.
I've seen this question and answer, but I need to be able to specify which field this should apply to, since some times an integer is actually an integer.
EDIT: The incoming JSON could possibly look like this (could also be String instead of int, etc...):
{
"regular_int": 1234,
"int_that_should_be_a_boolean": 1
}
I need a way to specify that int_that_should_be_a_boolean
should be parsed as a boolean and regular_int
should be parsed as an integer.
We will provide Gson with a little hook, a custom deserializer for booleans, i.e. a class that implements the JsonDeserializer<Boolean>
interface:
CustomBooleanTypeAdapter
import java.lang.reflect.Type;
import com.google.gson.*;
class BooleanTypeAdapter implements JsonDeserializer<Boolean> {
public Boolean deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
if (((JsonPrimitive) json).isBoolean()) {
return json.getAsBoolean();
}
if (((JsonPrimitive) json).isString()) {
String jsonValue = json.getAsString();
if (jsonValue.equalsIgnoreCase("true")) {
return true;
} else if (jsonValue.equalsIgnoreCase("false")) {
return false;
} else {
return null;
}
}
int code = json.getAsInt();
return code == 0 ? false :
code == 1 ? true : null;
}
}
To use it we’ll need to change a little the way we get the Gson
mapper instance, using a factory object, the GsonBuilder, a common pattern way to use GSON
is here.
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Boolean.class, new BooleanTypeAdapter());
Gson gson = builder.create();
For primitive Type use below one
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(boolean.class, new BooleanTypeAdapter());
Gson gson = builder.create();
Enjoy the JSON
parsing!
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