我有一个类,其中包含另一个类的集合。
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。
有没有办法实现它?
答案 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。