12

別のクラスのコレクションを保持するクラスがあります。

class A{
 @JsonView(VerboseViewA.Minimal.class)
 String field1;
 @JsonView(VerboseViewA.Complete.class)
 String field2;
 @JsonView(VerboseViewA.Complete.class)
 Collection<B> bEntities;
}

class B{
   @JsonView(VerboseViewB.Minimal.class)
    String field2;
   @JsonView(VerboseViewB.Complete.class)
    String field3;
 }

VerboseViewA.Complete を使用してクラス A をシリアル化するときに、コレクション bEntities を VerboseViewB.Minimal を使用してシリアル化する必要があります。

それを達成する方法はありますか?

4

3 に答える 3

3

同じ問題に苦しんだ後、私はこの解決策にたどり着きました:

class A
{
    @JsonView(VerboseViewA.Minimal.class)
    String field1;
    @JsonView(VerboseViewA.Complete.class)
    String field2;
    @JsonView(VerboseViewA.Complete.class)
    @JsonSerialize(using = VerboseMinimalSerializer.class)
    Collection<B> bEntities;
}

class B
{
    @JsonView(VerboseViewB.Minimal.class)
    String field2;
    @JsonView(VerboseViewB.Complete.class)
    String field3;
}

VerboseViewA.Complete.class を使用してクラス A のインスタンスをシリアル化すると、bEnitities が含まれ、カスタム VerboseMinimalSerializer を使用してシリアル化され、その JsonView がオーバーライドされます。

public class VerboseMinimalSerializer extends JsonSerializer<Object>
{
    @Override
    public void serialize(Object object, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException
    {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
        mapper.setSerializationInclusion(Include.NON_NULL);
        mapper.setConfig(mapper.getSerializationConfig().withView(VerboseViewB.Minimal.class));

        jsonGenerator.setCodec(mapper);
        jsonGenerator.writeObject(object);
    }
}

このカスタム シリアライザーは VerboseViewB.Minimal.class ビューを使用していることに注意してください。

于 2015-12-22T13:04:34.717 に答える