writevalueasstring serialize deserialize java json serialization jackson

serialize - objectmapper java



Jackson: la deserialización falla en dependencias circulares (1)

Ok, entonces estoy tratando de probar algunas cosas con el convertidor jackson json. Intento simular un comportamiento gráfico, así que estas son mis entidades POJO

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") public class ParentEntity implements java.io.Serializable { private String id; private String description; private ParentEntity parentEntity; private List<ParentEntity> parentEntities = new ArrayList<ParentEntity>(0); private List<ChildEntity> children = new ArrayList<ChildEntity>(0); // ... getters and setters } @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") public class ChildEntity implements java.io.Serializable { private String id; private String description; private ParentEntity parent; // ... getters and setters }

Las etiquetas son obligatorias para evitar excepciones en la serialización. Cuando intento serializar un objeto (tanto en un archivo como en una cadena simple) todo funciona bien. Sin embargo, cuando intento deserializar el objeto, arroja una excepción. Este es el método de prueba simple (try / catch omitido por simplicidad)

{ // create some entities, assigning them some values ParentEntity pe = new ParentEntity(); pe.setId("1"); pe.setDescription("first parent"); ChildEntity ce1 = new ChildEntity(); ce1.setId("1"); ce1.setDescription("first child"); ce1.setParent(pe); ChildEntity ce2 = new ChildEntity(); ce2.setId("2"); ce2.setDescription("second child"); ce2.setParent(pe); pe.getChildren().add(ce1); pe.getChildren().add(ce2); ParentEntity pe2 = new ParentEntity(); pe2.setId("2"); pe2.setDescription("second parent"); pe2.setParentEntity(pe); pe.getParentEntities().add(pe2); // serialization ObjectMapper mapper = new ObjectMapper(); File f = new File("parent_entity.json"); // write to file mapper.writeValue(f, pe); // write to string String s = mapper.writeValueAsString(pe); // deserialization // read from file ParentEntity pe3 = mapper.readValue(f,ParentEntity.class); // read from string ParentEntity pe4 = mapper.readValue(s, ParentEntity.class); }

y esta es la excepción lanzada (por supuesto, repetida dos veces)

com.fasterxml.jackson.databind.JsonMappingException: Already had POJO for id (java.lang.String) [com.fasterxml.jackson.annotation.ObjectIdGenerator$IdKey@3372bb3f] (through reference chain: ParentEntity["children"]->java.util.ArrayList[0]->ChildEntity["id"]) ...stacktrace... Caused by: java.lang.IllegalStateException: Already had POJO for id (java.lang.String) [com.fasterxml.jackson.annotation.ObjectIdGenerator$IdKey@3372bb3f] ...stacktrace...

Entonces, ¿cuál es la causa del problema? ¿Cómo puedo arreglarlo? ¿Necesito alguna otra anotación?


En realidad, parece que el problema fue con la propiedad "id". Como el nombre de la propiedad es igual para las dos entidades diferentes, hubo algunos problemas durante la deserialización. No sé si tiene sentido, pero resolví el problema al cambiar la etiqueta JsonIdentityInfo de ParentEntity a

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = ParentEntity.class))

Por supuesto, también cambié el alcance de ChildEntity con scope=ChildEntity.class como se sugiere aquí

Estoy abierto a nuevas respuestas y sugerencias por cierto.