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