Джексон не переопределяет Геттер с @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")
на сеттера для этого свойства.
кроме того, вместо @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") частная строка 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
атрибут on @JsonProperty
Так это работает:
@Transient
@ApiModelProperty(required = true)
@JsonProperty
String alternateName
void setProperty(String property) {
this.alternateName = property
}
@JsonIgnore
String getProperty() {
this.alternateName
}
обратите внимание на использование @JsonIgnore
на геттер. Если вы этого не сделаете, ваш фреймворк, вероятно, подберет его, и у вас будут дубликаты записей для того же самого в вашем JSON.
во всяком случае-я надеюсь, что это поможет кто-нибудь!
(*) мы пытались придерживаться определенного интерфейса, тем самым принудительно используя имя внутри. Однако открытый API нуждался в другом, удобном для пользователя имени.
мне не хватало зависимости databind
<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;