Gson custom deserializer just on field
android, gson
Solution
Here is the code for custom deserialization (for Gender) with sample invocation.
1) Gender deserializer is case insensitive
2) Invalid values handled (i.e. input json contains other than male and female)
Main method:-
public static void main(String[] args) {
String jsonString = "{'firstName' : 'john','lastName' : 'stones','gender' : 'male'}";
Gson gson = new GsonBuilder()
.registerTypeAdapter(Person.class, new PersonModelDeserializer())
.create();
Person person = gson.fromJson(jsonString, Person.class);
System.out.println(person.toString());
}
Gender Enum:-
public enum Gender {
MALE, FEMALE
}
Deserializer:-
If the input json doesn't have male or female, the `valueOf` method throws IllegalArgumentException which has been handled as well.
The Gender deserialization is case insensitive as well.
public class PersonModelDeserializer implements JsonDeserializer<Person> {
@Override
public Person deserialize(JsonElement paramJsonElement, Type paramType,
JsonDeserializationContext paramJsonDeserializationContext) throws JsonParseException {
Person person = new Gson().fromJson(paramJsonElement.getAsJsonObject(), Person.class);
try {
Gender gender = null;
if (paramJsonElement.getAsJsonObject().get("gender") != null) {
gender = Gender.valueOf(paramJsonElement.getAsJsonObject().get("gender").getAsString().toUpperCase());
}
person.setGender(gender);
} catch (IllegalArgumentException ie) {
System.out.println(ie.getMessage());
System.out.println("Gender cannot be serialized ..");
}
return person;
}
}
Person class:-
public class Person implements Serializable{
private static final long serialVersionUID = 5447375194275313051L;
private String firstName;
private String lastName;
private Gender gender;
... getters and setters
}
Problem
I use Volley with Gson. I have a person object, I'd like to set gender, not a string, but an enum. So I'd like to write a custom deserializer for just this field, and let Gson to do the rest. How can I do that?