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