2016-10-25 29 views
4

我用Gley使用Volley。 我有一个人对象,我想设置性别,而不是一个字符串,但是一个枚举。 所以我想为这个领域写一个自定义的反序列化器,让Gson去做其余的事情。 我该怎么做?Gson自定义解串器只是在场上

回答

4

以下是具有示例调用的自定义反序列化(用于性别)的代码。

1)性别解串器不区分大小写

2)无效的值来处理(即输入JSON含有比男性和女性)

主要方法等: -

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

    } 

性别枚举: -

public enum Gender { 
    MALE, FEMALE 
} 

解串器: -

如果输入JSON不具有男性或女性,所述valueOf方法抛出:IllegalArgumentException - 已被处理为好。

性别反序列化也是不区分大小写的。

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类: -

public class Person implements Serializable{ 
    private static final long serialVersionUID = 5447375194275313051L; 

    private String firstName; 
    private String lastName; 

    private Gender gender; 

    ... getters and setters 
}