working property not jsoninclude jsonignore attribute java json jackson ignore

java - property - jsonignore conditional



Jackson''s JsonIgnore (1)

La anotación JsonIgnore no parece funcionar para mí. ¿Alguna idea de por qué?

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

}

Salida: {"set": ["test"]}


Transitorio significa que ese campo no se serializará. No es necesario que agregue la anotación @JsonIgnore allí debido a que ese campo se excluirá de todos modos.

Puede ubicar la anotación de @JsonIgnore al menos en org.codehaus.jackson: jackson-mapper-asl: 1.9.13 y com.fasterxml.jackson.core: jackson-annotations: 2.4.3 (esto es lo que usé). Donde ObjectMapper está en artefacto jackson-mapper-asl. La parte interesante aquí es que si utilizo @JsonIgnore de jackson-annotations (com.fasterxml.jackson.annotation.JsonIgnore) - no funciona (''set'' es en respuesta) incluso si configuro ObjectMapper para usar solo propiedades . Probablemente es un error en la implementación de fasterxml pero no lo encontré.

Por lo tanto, está funcionando bien si va a usar codehaus en lugar de fasterxml (agregué configuración para usar solo campos):

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