Jackson条件自定义序列化器和反序列化器

时间:2019-07-08 10:14:46

标签: java object serialization deserialization customization

我找不到通过可以有条件控制的自定义注释来操纵值的大小写的正确方法。

我已经使用JsonFilters,序列化和反序列化在线研究了Jackson教程-我大部分都在工作,但并没有达到我想要的结果。

自定义序列化程序:

public class CaseSerializer extends JsonSerializer<String> {
    private boolean myCheck;

    public CaseSerializer() {
        // default
    }

    public CaseSerializer(boolean myControl) {
        this.myCheck = myControl;
    }

    @Override
    public void serialize(String value, JsonGenerator generator, SerializerProvider provider) throws IOException {
        if (value != null) {
            if (myCheck) {
                generator.writeString(value.toUpperCase());
            } else {
                generator.writeString(value);
            }
        }
    }
}

人员模型:

public class Person {
    @JsonSerialize(using = CaseSerializer.class)
    private String title;
    private String firstName;
    private String lastName;

    public Person(String title, String firstName, String lastName) {
        this.title = title;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    // getters, setters & toString
}

用法:

        Person person = new Person("dr", "john", "doe");

        SimpleModule module = new SimpleModule();
        module.addSerializer(String.class,new CaseSerializer(true));

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(module);
        String titleShouldBeUpper = mapper.writeValueAsString(person);

        System.out.println(titleShouldBeUpper);

通过运行提供的代码,我希望Person类中的title字段为大写,而其他值则保持不变。

(CaseSerializer(true)表示我想将值大写)

情况并非如此,因为代码将显示以下输出:

{"title":"dr","firstName":"JOHN","lastName":"DOE"}

当我在不将boolean myControl设置为true的情况下使用CaseSerializer()运行代码时,预期的输出是所有字段都不大写。

正在发生什么:

{"title":"dr","firstName":"john","lastName":"doe"}

这意味着默认情况下什么都不会改变。

如果我为大小写序列化调用了一个true的映射器,那么我只想要存在JsonSerialize(使用= CaseSerializer.class)的字段。

有什么想法吗?

0 个答案:

没有答案