2013-02-02 209 views
4

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

}

輸出:{ 「設定」:[ 「測試」]}

+0

我不記得肯定的,但setSet()暴露了嗎?我知道一個setter公開一些序列化的東西似乎很奇怪。 –

+5

哪個傑克遜版?另外:確保傑克遜映射器(具有ObjectMapper')和版本註釋jar的版本是相同的(兩者都是1.x,或者兩者都是2.x) - 如果這些版本混在一起,則無法識別註釋。 – StaxMan

+0

感謝StaxMan,我有兩個不同版本的註釋和objectmapper。 – hansi

回答

2

瞬態意味着字段將不被序列化。您不需要在那裏添加@JsonIgnore註釋,因爲該字段將被排除。

您可以至少在org.codehaus.jackson中找到@JsonIgnore註釋:jackson-mapper-asl:1.9.13和com.fasterxml.jackson.core:jackson-annotations:2.4.3(這是我用過的)。 ObjectMapper位於jackson-mapper-asl工件中。這裏有趣的部分是,如果我從jackson-annotations(com.fasterxml.jackson.annotation.JsonIgnore)使用@JsonIgnore - 它不起作用('set'作爲響應),即使我將ObjectMapper配置爲僅使用屬性。可能它是fastxml實現中的一個錯誤,但我沒有找到它。

所以,它工作正常,如果你將使用Codehaus的而不是fasterxml(我添加的配置只使用字段):

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