writevalueasstring serialize parse deserialize java json serialization jackson

java - serialize - objectmapper writevalueasstring



Omitir objetos condicionalmente al serializar con jackson (1)

Tengo una clase como

interface IHideable { boolean isHidden(); } class Address implements IHideable { private String city; private String street; private boolean hidden; } class PersonalInfo implements IHideable { private String name; private int age; private boolean hidden; }

Quiero serializar una Lista de IHable en mi servicio web; pero filtra cualquier objeto que tenga el campo oculto establecido en verdadero.

Básicamente dado con una lista de objetos como

[ {''city 1'',''street 1'',false}, {''city 2'',''street 2'',true}, {''city 3'',''street 3'',false} ]

Quiero la salida como

[ { city:''city 1'', street:''street 1'' }, { city:''city 3'', street:''street 3'' } ]

Intenté la siguiente implementación

class ItemSerializer extends JsonSerializer<IHideable> { @Override public void serialize(IHideable value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { if (!value.isHidden()) { jgen.writeStartObject(); jgen.writeString("city", value.city); jgen.writeString("street", value.street); jgen.writeEndObject(); } } }

Pero los métodos writeString escritos son específicos para la clase Address. Cuando uso writeObject allí arroja la excepción stackoverflow. ¿Puedo usar algún método genérico writeObject que pueda escribir cualquier objeto que implemente IHideable ()? ¿Es esto posible con la serialización por defecto / personalizada de jackson?


Puede usar BeanSerializerModifier para registrar un serializador para tipos IHideable y obtener la referencia al serializador de IHideable predeterminado como se discutió en esta pregunta.

En su serializador, marque el indicador isHidden y, si no está configurado, serialice la instancia utilizando el serializador predeterminado. Ese truco debería funcionar para cualquier tipo que implemente su interfaz IHideable . Aquí hay un ejemplo:

public class JacksonHide { @JsonIgnoreProperties("hidden") public static interface IHideable { boolean isHidden(); } public static class Address implements IHideable { public final String city; public final String street; public final boolean hidden; public Address(String city, String street, boolean hidden) { this.city = city; this.street = street; this.hidden = hidden; } @Override public boolean isHidden() { return hidden; } } public static class PersonalInfo implements IHideable { public final String name; public final int age; public final boolean hidden; public PersonalInfo(String name, int age, boolean hidden) { this.name = name; this.age = age; this.hidden = hidden; } @Override public boolean isHidden() { return hidden; } } private static class MyBeanSerializerModifier extends BeanSerializerModifier { @Override public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) { if (IHideable.class.isAssignableFrom(beanDesc.getBeanClass())) { return new MyIHideableJsonSerializer((JsonSerializer<IHideable>) serializer); } return super.modifySerializer(config, beanDesc, serializer); } private static class MyIHideableJsonSerializer extends JsonSerializer<IHideable> { private final JsonSerializer<IHideable> serializer; public MyIHideableJsonSerializer(JsonSerializer<IHideable> serializer) { this.serializer = serializer; } @Override public void serialize(IHideable value, JsonGenerator jgen, SerializerProvider provider) throws IOException { if (!value.isHidden()) { serializer.serialize(value, jgen, provider); } } } } public static void main(String[] args) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.setSerializerModifier(new MyBeanSerializerModifier()); mapper.registerModule(module); PersonalInfo p1 = new PersonalInfo("John", 30, false); PersonalInfo p2 = new PersonalInfo("Ivan", 20, true); Address a1 = new Address("A", "B", false); Address a2 = new Address("C", "D", true); System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString (Arrays.asList(p1, p2, a1, a2))); } }

Salida:

[ { "name" : "John", "age" : 30 }, { "city" : "A", "street" : "B" } ]