문제
질문 ObjectMapper
that을 나타내는 방법은 일부 기준 (필드)에 의해 개체의 중첩 된 컬렉션을 필터링해야합니다.코드를 통해 설명을 참조하십시오 :
코드를 통해 설명 :
Container
객체를 JSON으로 변환해야합니다.그러나 entries
필드를 기반으로 Entry.value
컬렉션을 필터링하고 싶습니다.나는 Container
를 직렬화하고 value == 1
의 항목 만 포함시키고 싶습니다.
public class Container {
List<Entry> entries;
public void setEntries(List<Entry> entries) {
this.entries = entries;
}
}
public class Entry {
int value;
public Entry(int value) {
this.value = value;
}
}
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
Container container = new Container();
container.setEntries(new LinkedList<Entry>({
{
add(new Entry(1));
add(new Entry(2));
add(new Entry(1));
}
}))
// Now I want to get container object only with two elements in list
mapper.writeValueAsString(container);
}
. 해결책
Entry
를 구현할 수 있습니다 JsonSerializable
를 만들 수 있습니다.잭슨 2.x에서는 다음과 같이 제공합니다 :
public class Entry
implements JsonSerializable
{
int value;
public Entry(int value)
{
this.value = value;
}
@Override
public void serialize(final JsonGenerator jgen,
final SerializerProvider provider)
throws IOException
{
// Don't do anything if value is not 1...
if (value != 1)
return;
jgen.writeStartObject();
jgen.writeNumberField("value", 1);
jgen.writeEndObject();
}
@Override
public void serializeWithType(final JsonGenerator jgen,
final SerializerProvider provider, final TypeSerializer typeSer)
throws IOException
{
serialize(jgen, provider);
}
}
.
다른 솔루션은 사용자 정의 JsonSerializer<Entry>
를 구현하고 직렬화하기 전에 등록하는 것입니다.그것은 기본적으로 위와 동일하게 할 것입니다.
제휴하지 않습니다 StackOverflow