Как удалить дубликаты @JsonProperty в Джексоне - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть очень простой класс JSON с Джексоном:

public class Hoge {
    @JsonProperty("id")
    public final int cid;

    public Hoge(@JsonProperty("id") aid){
        cid = aid;
    }
}

Я заметил, что мне нужно поместить @JsonProperty ("id") в два места для взаимного преобразования JSON-строки <-> объект JSON,Первое место - это объявление поля, а второе - аргумент конструктора.

Когда я удалил первое @JsonProperty, ключ JSON становится «cid», а не «id».Но я хочу, чтобы имя ключа было «id».

Когда я удалил второе, у меня есть исключение:

Не найдено подходящего конструктора для типа [простой тип, класс Series]: невозможно создать экземпляр объекта JSON (нужно добавить / включить информацию о типе?)

Я хочу сохранить имя поля («cid» в коде) и ключ JSON («id» в коде) отличаются.

Когда я удалил конструктор, у меня возникла ошибка компиляции, потому что id должен быть «final», чтобы он оставался неизменным.

Кто-нибудь знаеткак удалить дубликат @JsonProperty в примере?

1 Ответ

1 голос
/ 26 сентября 2019

Если вы действительно хотите сохранить модификатор final в поле и удалить аннотацию @JsonProperty из конструктора, вы можете аннотировать конструктор с помощью @JsonCreator и переименовать параметр с aid на id,как показано ниже:

@Data
public class Hoge {

    @JsonProperty("id")
    public final int cid;

    @JsonCreator
    public Hoge(int id){
        this.cid = id;
    }
}

Затем используйте один из следующих подходов:

ParanamerModule

Зарегистрируйте ParanamerModule в своем ObjectMappper:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new ParanamerModule());

Вам потребуется следующая зависимость от пути к классам:

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-paranamer</artifactId>
    <version>${jackson.version}</version>
</dependency>

Подробнее см. В документации .

ParameterNamesModule

Зарегистрируйте модуль ParameterNamesModule и убедитесь, что код скомпилирован с использованием опции -parameters:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));

Требуется следующая зависимость:

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-parameter-names</artifactId>
    <version>${jackson.version}</version>
</dependency>

Подробнее см. В документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...