2013-07-09 14 views
40

Czy istnieje wbudowany sposób serializowania identyfikatora dziecka tylko podczas korzystania z Jackson (szybciejxml.jackson 2.1.1)? Chcemy wysłać Order przez REST, który ma odniesienie Person. Obiekt osoby jest jednak dość skomplikowany i możemy go odświeżyć po stronie serwera, więc potrzebujemy tylko klucza głównego.Jak serializować tylko identyfikator dziecka z Jacksonem?

Czy potrzebuję do tego niestandardowego serializera? Czy muszę mieć wszystkie inne właściwości? Czy to uniemożliwiłoby przesłanie danych Person podczas żądania obiektu Order? Nie jestem jeszcze pewien, czy będę tego potrzebował, ale chciałbym mieć nad nim kontrolę, jeśli to możliwe ...

+0

Czy to może pomóc? http://stackoverflow.com/questions/8179986/jackson-change-jsonignore-dynamicznie – Omertron

Odpowiedz

87

Istnieje kilka sposobów. Pierwszy z nich jest użycie @JsonIgnoreProperties usunąć właściwości z dzieckiem, tak jak poniżej:

public class Parent { 
    @JsonIgnoreProperties({"name", "description" }) // leave "id" and whatever child has 
    public Child child; // or use for getter or setter 
} 

inna możliwość, jeśli obiekt Dziecko jest zawsze szeregowane jako ID:

public class Child { 
    // use value of this property _instead_ of object 
    @JsonValue 
    public int id; 
} 

i jeszcze jedno podejście jest użycie @JsonIdentityInfo

public class Parent { 
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") 
    @JsonIdentityReference(alwaysAsId=true) // otherwise first ref as POJO, others as id 
    public Child child; // or use for getter or setter 

    // if using 'PropertyGenerator', need to have id as property -- not the only choice 
    public int id; 
} 

, który również będzie działać do serializacji i ignorować właściwości inne niż id. Wynik nie byłby jednak zawijany jako obiekt.

+0

To jest naprawdę przydatne. Dzięki. Gdy używasz '@JsonIdentityReference (alwaysAsId = true)', Jackson nie może go odserializować, prawda? Czy można uzyskać tę samą funkcjonalność, pisząc niestandardowy Serializer/Deserializer? – miguelcobain

+1

Prawidłowo - jeśli nie ma id obiektu do dopasowania, Jackson nie może tego rozgryźć; więc zazwyczaj ta opcja ma sens w przypadku użycia serializacyjnego (gdzie coś innego może je złożyć w razie potrzeby). Niestandardowe (de) serializery mogą robić wszystko, co chcesz, więc teoretycznie tak. – StaxMan

+1

@StaxMan czy możesz powiedzieć, jak mogę użyć '@JsonIdentityReference (alwaysAsId = true', ale chcę, aby Wynik zawinięty w Object nie był normalnym atrybutem.) – Waqas

Powiązane problemy