Джексон не переопределяет Getter с @JsonProperty
JsonProperty
не переопределяет имя по умолчанию, которое jackson получает от получателя. Если я сериализую класс ниже с помощью ObjectMapper
и jackson, я получаю
{"hi":"hello"}
Как вы можете видеть, аннотация JsonProperty не имеет эффекта
class JacksonTester {
String hi;
@JsonProperty("hello")
public String getHi() {
return hi;
}
}
Помещение @JsonProperty
на строку не работает. Единственный способ, по которому я могу изменить имя, - это переименование геттера, единственная проблема в том, что он всегда будет строчным для первой буквы
Ответы
Ответ 1
Проблема заключалась в том, что я использовал как старые, так и новые библиотеки Jackson
то есть. до того, как я
import org.codehaus.jackson.annotate.JsonProperty;
Который мне пришлось изменить ниже, чтобы соответствовать библиотеке, которую я использовал.
Поскольку я использовал maven, это также означало обновление моих зависимостей maven.
import com.fasterxml.jackson.annotation.JsonProperty;
Чтобы он работал, мне нужна аннотация @JsonProperty
на геттере (помещать его на объект не получилось)
Я нашел ответ здесь (спасибо francescoforesti)
@JsonProperty не работает должным образом
Ответ 2
У меня была эта проблема при обновлении с более старой версии до 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;
}
}
Ответ 3
У меня был тот же самый proplem
Вам нужно просто заменить импорт
import com.fasterxml.jackson.annotation.JsonProperty;
на
import org.codehaus.jackson.annotate.JsonProperty;
Его работа.
Ответ 4
Я знаю, что это старый вопрос, но для меня он заработал, когда я выяснил, что он конфликтует с библиотекой Gson, поэтому мне пришлось использовать @SerializedName("name")
вместо @JsonProperty("name")
надеюсь, это поможет
Ответ 5
У случаев верблюдов все еще есть проблемы даже после определения правильных аннотаций.
Пример:
@JsonProperty ( "mirrorport" )
private String mirrorPort;
Дезициализация все еще не выполняется, когда xml имеет <mirrorport>YES</mirrorport>
Ответ 6
Поместите его на переменную, а не на getter
class JacksonTester {
@JsonProperty("hello")
private String hi;
public String getHi() {
return hi;
}
}
Ответ 7
Вы пробовали ниже
class JacksonTester {
private String hi;
@JsonProperty("hello")
public String getHi() {
return hi;
}
}
Я имею в виду сделать объявление переменной hi как закрытым.
Альтернативно попробуйте поместить @JsonIgnore в объявление переменной и в случае, если вы предпочитаете хранить его по умолчанию.
Ответ 8
Недавно я встретил еще один интересный поворот в этом вопросе. Мы начали использовать Hibernate5Module, чтобы помочь с некоторыми ленивыми проблемами загрузки. Кроме того, мы используем Groovy, поэтому мы не определяем геттеры и сеттеры.
Оказывается, что модуль Hibernate, похоже, вмешивается в аннотацию @JsonProperty
. В частности, если у вас есть что-то аннотированное с помощью @Transient
Итак, если у вас есть что-то вроде:
@Transient
@ApiModelProperty(required = true)
@JsonProperty("alternateName")
String property
Вы не увидите alternateName
в JSON. Кроме того, у ваших клиентов, скорее всего, возникнут проблемы со своими POST и PUT! Чтобы исправить это, вы можете использовать простой обходной путь. Определите геттеры и сеттеры для внутреннего имени, которое вам нужно использовать (*), и не используйте атрибут value
на @JsonProperty
. Так что это работает:
@Transient
@ApiModelProperty(required = true)
@JsonProperty
String alternateName
void setProperty(String property) {
this.alternateName = property
}
@JsonIgnore
String getProperty() {
this.alternateName
}
Обратите внимание на использование @JsonIgnore
на геттере. Если вы этого не сделаете, ваша инфраструктура, скорее всего, подберет ее, и у вас будут дубликаты записей для одной и той же вещи в вашем JSON.
Во всяком случае - я надеюсь, что это кому-то поможет!
(*) Мы пытались придерживаться определенного интерфейса, тем самым применяя внутреннее имя. Однако для открытого API требуется другое, удобное для пользователя имя.
Ответ 9
У меня была та же проблема.
Проблема заключалась в имени переменной. Я загадал, и первое письмо было "Верхним", я просто изменился, и проблема была исправлена.
изменения:
@JsonProperty(value="hello")
private String MyVar;
в
@JsonProperty(value="hello")
private String MyVar;
Ответ 10
Мне не хватало зависимости от данных
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${fasterxml.version}</version>
</dependency>
Ответ 11
При использовании Kotlin
Я понимаю, что первоначальный вопрос касается Java, но, поскольку Kotlin становится очень популярным, и многие могут его использовать, я хотел бы опубликовать его здесь, чтобы помочь другим.
В любом случае, для Kotlin, потому что, как работают геттеры/сеттеры, если вы используете val
, то есть вы выставляете только геттер, вам может понадобиться применить аннотацию к геттеру, как показано ниже:
class JacksonTester(@get:JsonProperty("hello") val hi: String)