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

时间:2014-04-24 05:24: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;
 }

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

有没有办法实现它?

3 个答案:

答案 0 :(得分: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;
 }

答案 1 :(得分: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类实例时,将使用自定义VerboseMinimalSerializer包含和序列化bEnitities,覆盖其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。

答案 2 :(得分:2)

你需要稍微改变你的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。