2013-06-25 14 views
15

Próbuję utworzyć wewnętrzny typ klasy dla obiektu przekazywanego jako JSON, ale gdy czytałem tu tony, a także stronę Jacksona, nie wydaje mi się, żebym mógł uzyskać odpowiednia kombinacja, więc jeśli ktokolwiek inny ma jakieś wskazówki, będzie bardzo ceniony. Poniżej zamieściłem kilka fragmentów i usunąłem wszystkie pobierające i ustawiające, nie sądziłem, że będą wymagały publikowania. Używam Jackson 2.2.Jackson Json Typ Mapowanie Wewnętrzna klasa

Klasy I 'm próby deserializowania:

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; 
    } 
} 

kodu używam do deserializowania:

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); 

Moje badania JSON dane:

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

Wewnętrzna klasa musi być statyczna. Zobacz http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html – Paul

+0

Podczas wykonywania tych instrukcji pojawia się błąd: "Typu członka [nazwy klasy] nie można zadeklarować statycznie, typy statyczne mogą być tylko zadeklarowane w typach statycznych lub najwyższego poziomu " – coltonfranco

+0

Więcej informacji o klasach zagnieżdżania i jackson można znaleźć w tym poście na blogu. Serializacja działa dobrze, ale deserializacja nie zajdzie, chyba że klasa jest typem zagnieżdżonym - http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html – testerjoe2

Odpowiedz

4

Jeśli może, a następnie uczynić swoje życie prostym i przenieść klasę wewnętrzną do normalnej klasy z odniesieniem w klasie Ustawienia. A następnie wykonaj rozrządowych korzystając Jackson, oto jak można mieć swoje zajęcia:

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

To rzeczywiście była wewnętrzna klasa powodująca wszystkie problemy. – ars265

+3

Lub użyj 'static' –

33

Poprawną odpowiedzią jest to, że brakuje słowa kluczowego static na wewnętrznej klasy.

Wystarczy się upewnić, że istnieje słowo kluczowe "statyczne".

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

zajmuje Ci 3 minuty, ale cię uszczęśliwić na resztę dnia.

+1

To powinna być zaakceptowana odpowiedź. –

+0

redochka - Jak zdecydować, czy używać statycznej klasy zagnieżdżonej (Twój anwser), czy po prostu składać (odpowiedź połączona ahsan.)? – testerjoe2

+0

@ testerjoe2 jest kwestią osobistego wyboru. Używam zagnieżdżonej klasy statycznej, gdy wiem, że nie będzie ona używana gdzie indziej, ponieważ jest ściśle powiązana z klasą hostingu. Jeśli zamierzam użyć tej klasy w innym miejscu, z pewnością umieszczę ją w osobnej klasie. – redochka

Powiązane problemy