2013-07-09 2 views
40

Есть ли встроенный способ сериализации идентификатора дочернего элемента при использовании Jackson (quickxml.jackson 2.1.1)? Мы хотим отправить Order через REST, который имеет ссылку Person. Однако объект person довольно сложный, и мы можем обновить его на стороне сервера, поэтому все, что нам нужно, это первичный ключ.Как сериализовать только идентификатор ребенка с помощью Jackson

Или мне нужен специальный сериализатор для этого? Или мне нужно @JsonIgnore все другие свойства? Из-за этого данные Person будут отправлены обратно при запросе объекта Order? Я не уверен, если мне это понадобится, но я хотел бы иметь контроль над ним, если это возможно ...

+0

Может ли это помочь? http://stackoverflow.com/questions/8179986/jackson-change-jsonignore-dynamically – Omertron

ответ

87

Существует несколько способов. Первый заключается в использовании @JsonIgnoreProperties для удаления свойств от ребенка, например, так:

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

другая возможность, если дочерний объект всегда сериализовать ID:

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

и еще один подход заключается в использовании @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; 
} 

который также будет работать для сериализации и игнорировать свойства, отличные от id. Однако результат не будет обернут как объект Object.

+0

Это действительно полезно. Благодарю. Когда вы используете '@JsonIdentityReference (alwaysAsId = true)', Джексон не может десериализовать его обратно, верно? Возможно ли достичь такой же функциональности, написав пользовательский Serializer/Deserializer? – miguelcobain

+1

Правильно - если идентификатор объекта не подходит, Джексон не может понять это; поэтому обычно этот параметр имеет смысл для случая использования только сериализации (где что-то еще может собрать его вместе, если потребуется). Пользовательские (де) сериализаторы могут делать все, что вы хотите, поэтому теоретически да. – StaxMan

+1

@StaxMan вы можете рассказать, как я могу использовать «@JsonIdentityReference (alwaysAsId = true», но я хочу получить результат, завернутый в Object, не как обычный атрибут. – Waqas

Смежные вопросы