Джексон не переопределяет Геттер с помощью @JsonProperty
JsonProperty не переопределяет имя по умолчанию, которое Джексон получает от геттера. Если я сериализую класс ниже с ObjectMapper и Джексоном, я получаю
{"hi":"hello"}
Как вы можете видеть, аннотация JsonProperty не имеет никакого эффекта
class JacksonTester {
String hi;
@JsonProperty("hello")
public String getHi() {
return hi;
}
}
Наложение @JsonProperty на саму строку также не работает. Единственный способ, которым я могу изменить имя, - это переименовать геттер, единственная проблема заключается в том, что он всегда будет строчным для первой буквы
9 ответов:
Проблема заключалась в том, что я использовал как старые, так и новые библиотеки Джексона
То есть до того, как я
import org.codehaus.jackson.annotate.JsonProperty;Который я должен был изменить ниже, чтобы соответствовать библиотеке, которую я использовал.Поскольку я использовал maven, это также означало обновление моих зависимостей maven.
import com.fasterxml.jackson.annotation.JsonProperty;Чтобы он работал, мне нужна была аннотация
@JsonPropertyна геттере (наложение ее на объект не сработало)Я нашел ответ здесь (Спасибо francescoforesti) @JsonProperty не работает как ожидается
У меня была эта проблема при обновлении с более старой версии до 2.8.3 FasterXML Jackson.
Проблема заключалась в том, что при десериализации ответа JSON из нашей БД в объект класса Java наш код не имел
@JsonSetterна установщиках класса. Следовательно, при сериализации выходные данные не использовали геттеры класса для сериализации объекта класса Java в JSON (следовательно, декоратор@JsonProperty()не действовал).Я исправил эту проблему, добавив
@JsonSetter("name-from-db")в метод setter для этого свойства.Также, вместо
@JsonProperty(), чтобы переименовать свойства с помощью метода getter, вы можете и должны использовать@JsonGetter(), который более специфичен для переименования свойств.Вот наш код:
public class KwdGroup { private String kwdGroupType; // Return "type" instead of "kwd-group-type" in REST API response @JsonGetter("type") // Can use @JsonProperty("type") as well public String getKwdGroupType() { return kwdTypeMap.get(kwdGroupType); } @JsonSetter("kwd-group-type") // "kwd-group-type" is what JSON from the DB API outputs for code to consume public void setKwdGroupType(String kwdGroupType) { this.kwdGroupType = kwdGroupType; } }
Случаи верблюда все еще, кажется, имеют проблемы даже после определения правильных аннотаций. Пример:
@JsonProperty ("mirrorport") private String mirrorPort;
Десериализация все еще не выполняется, когда xml имеет
<mirrorport>YES</mirrorport>
У меня был такой же проплем
Вам нужно просто заменить импорт импорт com.fasterxml.Джексон.аннотация.JsonProperty; на импортная организация.codehaus.Джексон.комментировать.JsonProperty; Своя работа.
Поместите его на переменную, а не на геттер
class JacksonTester { @JsonProperty("hello") private String hi; public String getHi() { return hi; } }
Вы пробовали ниже
class JacksonTester { private String hi; @JsonProperty("hello") public String getHi() { return hi; } }Я имею в виду объявление переменной " hi " как частной. В качестве альтернативы попробуйте поместить @JsonIgnore в объявление переменной и в случае, если вы предпочитаете сохранить его в области по умолчанию.
Недавно я столкнулся с еще одним интересным поворотом в этом вопросе. Мы начали использовать Hibernate5Module, чтобы помочь с некоторыми проблемами ленивой загрузки. Кроме того, мы используем Groovy, поэтому мы не определяем геттеров и сеттеров.
Оказывается, что модуль Hibernate, по-видимому, мешает аннотации
@JsonProperty. В частности, если у вас есть что-то с аннотацией@TransientТак, если у вас есть что-то вроде:@Transient @ApiModelProperty(required = true) @JsonProperty("alternateName") String propertyВы не увидите
alternateNameв JSON. Кроме того, ваши клиенты, скорее всего, будут есть проблемы с их постами и помещениями! Чтобы исправить это, вы можете использовать простой обходной путь. Определите геттеры и сеттеры для внутреннего имени, которое вам нужно использовать (*), и не используйте атрибутvalueна@JsonProperty, поэтому это работает:@Transient @ApiModelProperty(required = true) @JsonProperty String alternateName void setProperty(String property) { this.alternateName = property } @JsonIgnore String getProperty() { this.alternateName }Обратите внимание на использование
@JsonIgnoreна геттере. Если вы этого не сделаете, ваш фреймворк, вероятно, возьмет его, и у вас будут дубликаты записей для того же самого в вашем JSON.В любом случае-я надеюсь, что это кому-то поможет!
(*) мы пытались придерживаться определенный интерфейс, таким образом принуждая имя внутренне. Однако для открытого API требовалось другое, удобное для пользователя имя.
Мне не хватало зависимости от привязки данных
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${fasterxml.version}</version> </dependency>
У меня была такая же проблема. Проблема заключалась в имени переменной. Я загадал, и первая буква была прописной, я просто изменил, и проблема была исправлена.
Изменение:
@JsonProperty(value="hello") private String MyVar;Кому:
@JsonProperty(value="hello") private String myVar;
Comments