如何使用嵌套对象使用@Jsonview进行序列化

kir*_*uba 11 java spring jackson json-view

我有一个类,其中包含另一个类的集合.

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;
 }
Run Code Online (Sandbox Code Playgroud)

当我使用VerboseViewA.Complete序列化A类时,我希望使用VerboseViewB.Minimal序列化集合bEntities.

有没有办法实现它?

kir*_*uba 8

这解决了我的问题.我不确定是否有更好的方法来解决这个问题.

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

 class B{
    @JsonView({VerboseViewA.Complete.class,VerboseViewB.Minimal.class})
    String field2;
    @JsonView(VerboseViewB.Complete.class)
    String field3;
 }
Run Code Online (Sandbox Code Playgroud)


Nem*_*man 5

在与同样的问题作斗争之后,我提出了这个解决方案:

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;
}
Run Code Online (Sandbox Code Playgroud)

现在,当使用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,此自定义序列化程序使用视图 VerboseViewB.Minimal.class。