Java Json Jackson сохранение приватных полей без геттеров и сеттеров - PullRequest
0 голосов
/ 26 сентября 2018

Я использую 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;
    }

}

Даже если имя человека (в данном случае) НЕ МОЖЕТ быть изменено, равно как и год его рождения, я должен иметь геттеры и сеттеры, чтобы Джексон мог распознать значения, иначе это даст исключение:

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

Как я могу сделать мои поля name и yearOfBirth (не делая их PUBLIC ofcourse) последними полями недоступными для редактирования после инициализации.

Это мое сохранение и загрузка с использованием Джексона:

сохранение:

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

}

1 Ответ

0 голосов
/ 26 сентября 2018

Пользователь @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;
    }
}
...