문제

질문 ObjectMapperthat을 나타내는 방법은 일부 기준 (필드)에 의해 개체의 중첩 된 컬렉션을 필터링해야합니다.코드를 통해 설명을 참조하십시오 :

코드를 통해 설명 :

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>를 구현하고 직렬화하기 전에 등록하는 것입니다.그것은 기본적으로 위와 동일하게 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top