Джексон не переопределяет 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)