Gson自定义反序列化器仅针对字段

16

我使用Volley和Gson。 我有一个人的对象,我想设置性别,而不是字符串,而是枚举类型。 因此,我想为这个字段编写一个自定义反序列化器,并让Gson完成其他工作。 我该怎么做?

1个回答

19

这是用于 Gender 自定义反序列化的代码,并附有示例调用。

1) Gender 反序列化不区分大小写

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;
    }

}

人类:

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

    private String firstName;
    private String lastName;

    private Gender gender;

    ... getters and setters
}

如果对象是不可变的,这可能并不理想。 - TriCore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接