JsonIgnore Джексона

Аннотация JsonIgnore, похоже, у меня не работает. Есть идеи, почему?

public class JsonTest implements Serializable {

    @JsonIgnore
private static JsonTest instance = null;

@JsonIgnore
private transient Set<String> set = new CopyOnWriteArraySet<String>();

private JsonTest() {}

@JsonIgnore
public static JsonTest getInstance() {
    if (instance == null)
        instance = new JsonTest();
    return instance;
}

public void setSet(Set<String> set) {
    this.set = set;
}

@JsonIgnore
public Set<String> getSet() {
    return set;
}

public String toString() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
    try {
        return mapper.writeValueAsString(this);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

public static void main(String[] args) {
    HashSet<String> set = new HashSet<String>();
    set.add("test");
    JsonTest.getInstance().setSet(set);
    System.out.println(JsonTest.getInstance().toString());
}

}

Вывод: {"установить":["тест"]}


person hansi    schedule 02.02.2013    source источник
comment
Я точно не помню, но выставляет ли это setSet()? Я знаю, кажется странным, что сеттер выставляет что-то для сериализации.   -  person Programmer Bruce    schedule 02.02.2013
comment
Какая версия Джексона? Кроме того: убедитесь, что версия картографа Джексона (с ObjectMapper) и версия jar аннотаций совпадают (1.x для обоих или 2.x для обоих) — если они перепутаны, аннотации не распознаются.   -  person StaxMan    schedule 04.02.2013
comment
Спасибо StaxMan, у меня было две разные версии аннотаций и картографа объектов.   -  person hansi    schedule 04.02.2013
comment
@StaxMan - я хочу добавить статический служебный метод внутри аннотированного Джексоном POJO. Он отлично работает, но нужно ли мне добавлять какие-либо аннотации, такие как @JsonIgnore, к моему статическому методу?   -  person MasterJoe    schedule 19.08.2018


Ответы (1)


Transient означает, что это поле не будет сериализовано. Вам не нужно добавлять туда аннотацию @JsonIgnore, потому что это поле все равно будет исключено.

Вы можете найти аннотацию @JsonIgnore по крайней мере в org.codehaus.jackson:jackson-mapper-asl:1.9.13 и com.fasterxml.jackson.core:jackson-annotations:2.4.3 (это то, что я использовал). Где ObjectMapper находится в артефакте jackson-mapper-asl. Интересная часть здесь заключается в том, что если я использую @JsonIgnore из аннотаций jackson (com.fasterxml.jackson.annotation.JsonIgnore) — это не работает («set» в ответ), даже если я настрою ObjectMapper на использование только свойств . Возможно, это ошибка в реализации fastxml, но я ее не нашел.

Итак, он отлично работает, если вы будете использовать codehaus, а не fastxml (я добавил конфигурацию для использования только полей):

import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

public class JsonTest implements Serializable {
    @JsonIgnore
    private static JsonTest instance = null;

    private transient Set<String> set = new CopyOnWriteArraySet<String>();

    private JsonTest() {}

    @JsonIgnore
    public static JsonTest getInstance() {
        if (instance == null)
            instance = new JsonTest();
        return instance;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    @JsonIgnore
    public Set<String> getSet() {
        return set;
    }

    public String toString() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
        mapper.setVisibilityChecker(mapper.getSerializationConfig().getDefaultVisibilityChecker()
                .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
                .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));
        try {
            return mapper.writeValueAsString(this);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void main(String[] args) {
        HashSet<String> set = new HashSet<String>();
        set.add("test");
        JsonTest.getInstance().setSet(set);
        System.out.println(JsonTest.getInstance().toString());
    }
}
person Ilya Ovesnov    schedule 28.11.2014