tutorial recursivos recursivo recursividad recursiones que problemas potencia metodos metodo ejemplos definicion con java json serialization jackson

java - recursivos - Jackson JSON serialización, evitación de recursión por definición de nivel



recursividad con string en java (7)

Uso la biblioteca de Jackson para la serialización de mis objetos pojo en la representación JSON . Por ejemplo, tengo clase A y clase B:

class A { private int id; private B b; constructors... getters and setters } class B { private int ind; private A a; constructors... getters and setters }

Si quiero serializar un objeto de la clase A, hay cierta posibilidad de obtener recursión mientras está serializado. Sé que puedo detenerlo usando @JsonIgnore .

¿Es posible limitar la serialización por nivel de profundidad?

Por ejemplo, si el nivel es 2, la serialización será de esta manera:

  • serialize a, level = 0 (0 <2 ok) -> serializar
  • serializar ab, nivel = 1 (1 <2 ok) -> serializar
  • serialize aba, level = 2 (2 <2 no es verdad) -> stop

Gracias por adelantado.


Después de varios meses y mucha investigación, implementé mi propia solución para mantener mi dominio libre de las dependencias de jackson.

public class Parent { private Child child; public Child getChild(){return child;} public void setChild(Child child){this.child=child;} } public class Child { private Parent parent; public Child getParent(){return parent;} public void setParent(Parent parent){this.parent=parent;} }

Primero, debe declarar cada una de sus entidades de la relación bidireccional en algo como esto:

public interface BidirectionalDefinition { @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id", scope=Parent.class) public interface ParentDef{}; @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id", scope=Child.class) public interface ChildDef{}; }

Después de eso, el asignador de objetos se puede configurar automáticamente:

ObjectMapper om = new ObjectMapper(); Class<?>[] definitions = BidirectionalDefinition.class.getDeclaredClasses(); for (Class<?> definition : definitions) { om.addMixInAnnotations(definition.getAnnotation(JsonIdentityInfo.class).scope(), definition); }


En algunos casos, puede limitar la profundidad de serialización utilizando un entero local de subproceso que tenga la profundidad máxima. Vea esta answer .


No hay soporte para ignorantes basados ​​en niveles.

Pero puede hacer que Jackson maneje las referencias cíclicas con 2.0, vea por ejemplo " Jackson 2.0 liberado " para obtener una explicación sobre cómo usar @JsonIdentityInfo .



Recientemente encontré un problema similar: Jackson: serialización de entidades con relaciones birecionales (evitando ciclos)

Entonces, la solución es actualizar a Jackson 2.0 y agregar a las clases la siguiente anotación:

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id") public class SomeEntityClass ...

Esto funciona perfectamente


Si desea limitarse a un solo nivel (es decir, vaya a los elementos secundarios del objeto actual y no más allá), hay una solución simple con @JsonView.

En cada campo que sea un enlace a otro objeto, anótelo con la clase actual como su vista:

class A { private int id; @JsonView(A.class) private B b; constructors... getters and setters } class B { private int ind; @JsonView(B.class) private A a; constructors... getters and setters }

Luego, al serializar, use la clase de objeto como su vista. Serializar una instancia de A representaría algo así:

{ id: 42, b: { id: 813 } }

Asegúrese de que DEFAULT_VIEW_INCLUSION esté establecido en verdadero, o los campos sin una anotación @JsonView no serán representados. Alternativamente, puede anotar todos los demás campos con @JsonView usando la clase Object o cualquier superclase común:

class A { @JsonView(Object.class) private int id; @JsonView(A.class) private B b; constructors... getters and setters }


Verifique los siguientes enlaces, podría ayudar:

La única opción después de eso sería crear su propio módulo personalizado para la serialización / deserialización para su tipo de objeto. mira aquí:

Saludos.