Джексон не переопределяет Геттер с помощью @JsonProperty



JsonProperty не переопределяет имя по умолчанию, которое Джексон получает от геттера. Если я сериализую класс ниже с ObjectMapper и Джексоном, я получаю



{"hi":"hello"}


Как вы можете видеть, аннотация JsonProperty не имеет никакого эффекта



class JacksonTester {
String hi;

@JsonProperty("hello")
public String getHi() {
return hi;
}
}


Наложение @JsonProperty на саму строку также не работает. Единственный способ, которым я могу изменить имя, - это переименовать геттер, единственная проблема заключается в том, что он всегда будет строчным для первой буквы

750   9  

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

    Ничего не найдено.