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 类时,我希望使用 VerboseViewB.Minimal 序列化集合 bEntities。

有没有办法实现它?

4

3 回答 3

9

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

 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;
 }
于 2014-04-24T09:19:59.917 回答
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 回答
3

您需要稍微更改一下 json 视图层次结构:

public class MinimalView { };
public class AComplete extends MinimalView { };
public class BComplete extends MinimalView { };

然后你可以注释你的类

class A{
    @JsonView(MinimalView.class)
    String field1;
    @JsonView(AComplete.class)
    String field2;
    @JsonView(AComplete.class)
    Collection<B> bEntities;
 }

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

当您使用视图 AComplete 进行序列化时,序列化程序将采用 AComplete 和 MinimalView 属性,因为 AComplete 扩展了 MinimalView。

于 2016-07-21T03:28:17.733 回答