Возможно ли: иметь одно поле в классе, но разные имена для него во время сериализации / десериализации в библиотеке Джексона?
Например, у меня есть класс "Coordiantes".
class Coordinates{
int red;
}
Для десериализации из JSON нужно иметь такой формат:
{
"red":12
}
Но когда я сериализую объект, результат должен быть таким:
{
"r":12
}
Я попытался реализовать это, применив @JsonProperty
аннотацию как к получателю, так и к установщику (с разными значениями):
class Coordiantes{
int red;
@JsonProperty("r")
public byte getRed() {
return red;
}
@JsonProperty("red")
public void setRed(byte red) {
this.red = red;
}
}
но я получил исключение:
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: нераспознанное поле "красный"
Вы можете использовать
@jsonAlias
который был введен в Джексон 2.9.0Пример:
Используется
r
во время сериализации, но допускаетсяred
в качестве псевдонима при десериализации. Это все еще позволяетr
десериализовать также, все же.источник
has no effect during serialization where primary name is always used
. Это не то, что хочет ОП.r
качестве основного имени, ноred
для@JsonAlias
, который позволяет сериализовать егоr
, но добавляет,red
чтобы быть признанным при десериализации. Аннотирование с@JsonProperty("r")
и, кроме того,@JsonAlias("red")
должно работать нормально для данной проблемы.Вы можете использовать комбинацию @JsonSetter и @JsonGetter для управления десериализацией и сериализацией вашего свойства соответственно. Это также позволит вам сохранить стандартизированные имена методов получения и установки, которые соответствуют вашему фактическому имени поля.
источник
Я бы связал две разные пары геттеров / сеттеров с одной переменной:
источник
@JsonGetter
а@JsonSetter
. Таким образом, можно точно установить, как будет вести себя сериализатор.Возможно иметь нормальную пару геттер / сеттер. Вам просто нужно указать режим доступа в
@JsonProperty
Вот тестовый модуль для этого:
Я получил вывод следующим образом:
источник
Это было не то, что я ожидал как решение (хотя это законный вариант использования). Мое требование состояло в том, чтобы позволить существующему клиенту с ошибками (мобильное приложение, которое уже выпущено) использовать альтернативные имена.
Решение заключается в предоставлении отдельного метода установки, подобного этому:
источник
Я знаю, что это старый вопрос, но для меня он заработал, когда я выяснил, что он конфликтует с библиотекой Gson, поэтому, если вы используете Gson, используйте
@SerializedName("name")
вместо@JsonProperty("name")
надежды, что это поможетисточник
@JsonAlias
Аннотирование, с которым познакомился с Jackson 2.9+, без упоминания@JsonProperty
о десериализованном элементе с более чем одним псевдонимом (разные имена для свойства json) работает нормально.Я использовал
com.fasterxml.jackson.annotation.JsonAlias
для соответствия пакета сcom.fasterxml.jackson.databind.ObjectMapper
моим сценарием использования.Например:
просто отлично работает
источник
Должно быть, они включили это как функцию, потому что теперь установка другого значения
@JsonProperty
для метода получения и установки дает в точности то, что вы ожидаете (другое имя свойства при сериализации и десериализации для одного и того же поля). Джексон версия 2.6.7источник
Вы можете написать сериализованный класс для этого:
источник