2016-07-19 16 views
-2

Ist es möglich, die folgende Klasse mit Jackson zu deserialisieren?Deserialisieren von zyklischen JSON mit nur einer Klasse in Jackson

So war die ursprüngliche Version der Frage nicht ganz genau. Hier ist ein minimales Beispiel, um das Problem zu reproduzieren.

import java.io.IOException; 

import com.fasterxml.jackson.annotation.JsonCreator; 
import com.fasterxml.jackson.annotation.JsonIdentityInfo; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.ObjectIdGenerators; 
import com.fasterxml.jackson.databind.ObjectMapper; 

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

    public Thing thing; 

    @JsonCreator 
    public Thing(@JsonProperty("thing") Thing thing) { 
    this.thing = thing; 
    } 

    public static void main(String[] args) throws IOException { 
    ObjectMapper mapper = new ObjectMapper(); 

    Thing cyclic = new Thing(null); 
    cyclic.thing = cyclic; 

    String serialised = mapper.writeValueAsString(cyclic); 
    System.out.println(serialised); 

    Thing deserialised = mapper.readerFor(Thing.class).readValue(serialised); 
    System.out.println(deserialised.thing == deserialised); 
    } 
} 

Dies verursacht die nicht aufgelöste Forward-Referenzausnahme. Das Problem scheint zu sein, dass Jackson gesagt wird, den annotierten Konstruktor zu benutzen, aber es kann wegen der zyklischen Abhängigkeit nicht.

+0

Ich bin nicht sicher, Jackson kann so out of the box (Ich bin bereit, sich als falsch erwiesen, obwohl). Ich würde annehmen, dass Jackson zuerst versucht, das Objekt vollständig zu deserialisieren, bevor es in einen Speicher gelegt wird, um als Referenz nachgeschlagen zu werden. Da das Objekt jedoch nicht deserialisiert werden kann, ohne die Suche durchzuführen, haben Sie eine Art Deadlock. Sie müssen also möglicherweise einen benutzerdefinierten Deserializer verwenden. – Thomas

+0

welche Version von Jackson verwenden Sie? Ich habe versucht mit einer Version von 2.4.1 und es funktioniert gut mit '@ JsonIdentityInfo'. – Wilson

+0

Ich benutze 2.6.3. Ja, das funktioniert, mein Fehler. Ich habe es herausgefunden. Werde diese Frage beantworten. – user1953221

Antwort

-1

Die Lösung besteht darin, einen Standardkonstruktor hinzuzufügen und die @JsonProperty und @JsonCreator Annotationen zu entfernen.

Verwandte Themen