2013-06-25 2 views
15

Ich versuche, den inneren Klassen-Typ für ein Objekt als JSON übergeben zu werden, aber während ich gelesen habe Tonnen hier und Jacksons Website scheint ich nicht in der Lage, die zu bekommen richtige Kombination, also wenn jemand anderes irgendwelche Hinweise hat, würden sie sehr geschätzt werden. Ich habe unten ein paar Ausschnitte geposted und alle Getter und Setter entfernt, ich habe nicht gedacht, dass sie gepostet werden müssen. Ich benutze Jackson 2.2.Jackson Json Art Mapping innere Klasse

Die Klassen Ich bin versucht zu deserialisieren:

public class Settings { 
    private int offset; 
    private int limit; 
    private String type; 
    private Map<String, Criteria> criteria; 

    public class Criteria { 
    private String restriction; 
    private Object value; 
    } 
} 

Der Code, den ich deserialisieren bin mit:

ObjectMapper om = new ObjectMapper(); 
TypeFactory tf = om.getTypeFactory(); 
JavaType map = tf.constructMapLikeType(Map.class, String.class, Criteria.class); 
JavaType type = typeFactory.constructType(Settings.class, map); 
Settings settings = om.readValue(entity, type); 

Meine JSON Testdaten:

{ "type": "org.json.Car", "criteria": { "restriction": "eq", "value": "bmw" } } 
+1

Die innere Klasse muss statisch sein. Siehe http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html – Paul

+0

Wenn ich diesen Anweisungen folge, bekomme ich den Fehler: "Der Membertyp [Klassenname] kann nicht als statisch deklariert werden; statische Typen können nur sein In statischen oder Top-Level-Typen deklariert " – coltonfranco

+0

In diesem Blogpost finden Sie weitere Informationen zu Schachtelklassen und Jacksons. Serialisierung funktioniert gut, aber Deserialisierung wird nicht, wenn die Klasse statisch verschachtelt ist - http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html – testerjoe2

Antwort

4

Wenn Sie kannst, dann mach dein Leben einfach und verschiebe die innere Klasse in eine normale Klasse mit einer Referenz in der Klasse Einstellungen. Und dann tun, um die Rangierung jackson verwenden, hier ist, wie Sie Ihre Klassen haben:

public class Settings { 
    private int offset; 
    private int limit; 
    private String type; 
    private Map<String, Criteria> criteria; 
    private Criteria criteria; 
} 


class Criteria { 
    private String restriction; 
    private Object value; 
    } 
+0

Es war in der Tat die innere Klasse, die das ganze Problem verursacht. – ars265

+3

Oder verwenden Sie 'static' –

33

Die richtige Antwort ist, dass Sie das Schlüsselwort static auf der inneren Klasse fehlen.

Stellen Sie sicher, dass das Schlüsselwort "static" vorhanden ist.

Lesen http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html

es Ihnen in 3 Minuten in Anspruch nimmt, aber sie für den Rest des Tages glücklich machen.

+1

Dies sollte die akzeptierte Antwort sein. –

+0

redochka - Wie entscheiden wir, ob Sie eine statische verschachtelte Klasse (Ihre Antwort) oder einfach eine Komposition (juned ahsan antwort) verwenden? – testerjoe2

+0

@ testerjoe2 es ist eine Frage der persönlichen Entscheidung. Ich benutze eine verschachtelte statische Klasse, wenn ich weiß, dass sie nirgendwo anders verwendet wird, da sie eng mit der Hosting-Klasse verbunden ist. Wenn ich diese Klasse woanders verwende, lege ich sie sicher in eine separate Klasse. – redochka