【问题标题】:Java Json Jackson saving private fields without getters and settersJava Json Jackson 在没有 getter 和 setter 的情况下保存私有字段
【发布时间】:2019-03-01 20:53:08
【问题描述】:

我正在使用 Jackson 将我的 java 对象 (Person.class) 保存为 json 文件,并使用 jackson 从中加载。

这是我目前正在保存的:

public class Person {

    private String name;

    private int yearOfBirth;

    public Person(String name, int yearOfBirth) {
       this.name = name;
       this.yearOfBirth = yearOfBirth;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getYearOfBirth() {
        return yearOfBirth
    }

    public void setYearOfBirth(int yearOfBirth) {
       this.yearOfBirth = yearOfBirth;
    }

}

即使一个人的名字(在这种情况下)不能更改,他们的出生年份也不能更改,我必须让 Jackson 的 getter 和 setter 识别这些值,否则会出现异常:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "name"

如何使我的字段名称和 yearOfBirth(当然不让它们成为公共)最终字段在初始化后不可编辑。

这是我使用jackson保存和加载的:

保存:

public void savePerson(File f, Person cache) {
    ObjectMapper saveMapper = new ObjectMapper()
                    .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
            saveMapper.setVisibilityChecker(
                saveMapper.getSerializationConfig().
                        getDefaultVisibilityChecker().
                        withFieldVisibility(JsonAutoDetect.Visibility.ANY).
                        withGetterVisibility(JsonAutoDetect.Visibility.NONE).
                        withIsGetterVisibility(JsonAutoDetect.Visibility.NONE)
            );
            ObjectWriter writer = saveMapper.writer().withDefaultPrettyPrinter();
            writer.writeValue(f, cache);
}

正在加载:

public Person load(File f) {

    return new ObjectMapper().readValue(f, Person.class);

}

【问题讨论】:

标签: java json performance jackson save


【解决方案1】:

用户@JsonProperty,它会工作。

import com.fasterxml.jackson.annotation.JsonProperty;

public class Person {

    private final String name;

    private final int yearOfBirth;

    public Person(@JsonProperty("name") String name, @JsonProperty("yearOfBirth") int yearOfBirth) {
        this.name = name;
        this.yearOfBirth = yearOfBirth;
    }

    public String getName() {
        return name;
    }

    public int getYearOfBirth() {
        return yearOfBirth;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    相关资源
    最近更新 更多