2016-05-31 5 views
-1

Bitte helfen Sie mir, Baumstruktur im JSON-Format zu speichern. Ich habeWie wird der Zirkelverweis in der JSON-Serialisierung aufgelöst?

ERROR 6444 --- [nio-8090-exec-1] o.a.c.c.C.[.[.[/]. [dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler processing failed; nested exception is java.lang.StackOverflowError] with root cause 

java.lang.StackOverflowError: null 
    at java.lang.Class.getGenericInterfaces(Class.java:912) ~[na:1.8.0_40] 
    at com.fasterxml.jackson.databind.type.TypeFactory._doFindSuperInterfaceChain(TypeFactory.java:1260) ~[jackson-databind-2.6.6.jar:2.6.6] 
    at com.fasterxml.jackson.databind.type.TypeFactory._findSuperInterfaceChain(TypeFactory.java:1254) ~[jackson-databind-2.6.6.jar:2.6.6] 
    // more stacktrace here... 

auf dem folowing Code:

public class CustomASTNode implements ASTNode { 
    private final CustomNode node; // simple property 
    private final ASTNodeID id; // simple property 
    @JsonBackReference 
    private final ASTNode parent; // circular property! 
    @JsonManagedReference 
    private List<ASTNode> children = new ArrayList<>(); // circular property! 
    // more code 
} 

public interface ASTNode extends Iterable<ASTNode> { // ? 
    // more code 
} 

I verwendet @JsonBackReference und @JsonManagedReference Anmerkungen mit Feldern zu beschäftigen, haben aber keine Ideen, wie Rekursion in der Schnittstelle zu lösen. Ist es möglich oder vielleicht ist es notwendig, dieses Snippet neu zu schreiben?

+2

Wenn es ein zirkulärer Verweis, es ist kein Baum. –

+0

@AndyTurner ja, aber ich spreche über Zirkel Verweis in Schnittstellendefinition ('ASTNode erweitert Iterable '), während Baum von 'CustomASTNode' Objekte mit' Eltern- und 'Kinder' Felder –

+0

Nur um klar zu sein, sind Sie Sagen Sie, dass Ihre ASTNode ein Diagramm mit Zyklen bildet? – Pace

Antwort

1

Werfen Sie einen Blick auf http://wiki.fasterxml.com/JacksonFeatureObjectIdentity

Ein einfaches Beispiel wäre:

@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") 
public class Identifiable 
{ 
    public int value; 

    public Identifiable next; 
} 

und wenn wir einen Zyklus geschaffen von zwei Werten aus, wie:

Identifiable ob1 = new Identifiable(); 
ob1.value = 13; 
Identifiable ob2 = new Identifiable(); 
ob2.value = 42; 
// link as a cycle: 
ob1.next = ob2; 
ob2.next = ob1; 

und serialisiert Verwenden:

String json = objectMapper.writeValueAsString(ob1); 

würden wir folgende Serialisierung für JSON erhalten:

{ 
    "@id" : 1, 
    "value" : 13, 
    "next" : { 
     "@id" : 2, 
     "value" : 42, 
     "next" : 1 
    } 
} 
+0

Danke, '@ JsonIdentityInfo' Annotation mit Entfernen' erweitert Iterable 'von Interface-Definition lösen Probleme. –

Verwandte Themen