【问题标题】:Jackson's JsonIgnore杰克逊的 JsonIgnore
【发布时间】:2013-02-02 17:08:04
【问题描述】:

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());
}

}

输出:{"set":["test"]}

【问题讨论】:

  • 我不记得了,但是 setSet() 暴露了它吗?我知道 setter 为序列化公开某些内容似乎很奇怪。
  • 杰克逊的哪个版本?另外:确保 Jackson 映射器的版本(具有 ObjectMapper)和注释 jar 的版本相同(两者均为 1.x,或两者均为 2.x)——如果它们混淆了,则无法识别注释。
  • 感谢 StaxMan,我有两个不同版本的 annotation 和 objectmapper。
  • @StaxMan - 我想在杰克逊注释的 POJO 中添加一个静态实用程序方法。它工作正常,但我是否需要在我的静态方法中添加任何注释,例如“@JsonIgnore”?

标签: java json jackson


【解决方案1】:

Transient 表示该字段不会被序列化。您不需要在那里添加 @JsonIgnore 注释,因为该字段无论如何都会被排除在外。

您至少可以在 org.codehaus.jackson:jackson-mapper-asl:1.9.13 和 com.fasterxml.jackson.core:jackson-annotations:2.4.3 中找到@JsonIgnore 注释(这是我使用的) . ObjectMapper 在 jackson-mapper-asl 工件中的位置。这里有趣的部分是,如果我使用来自 jackson-annotations (com.fasterxml.jackson.annotation.JsonIgnore) 的@JsonIgnore - 即使我将 ObjectMapper 配置为仅使用属性,它也不起作用('set' 作为响应) .可能是fastxml实现中的一个bug,但我没找到。

因此,如果您将使用 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());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-03
    • 2015-12-05
    • 2012-09-17
    • 2014-09-30
    • 2020-04-12
    • 2015-05-14
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多