如何使用带有嵌套对象的@Jsonview 进行序列化
Posted
技术标签:
【中文标题】如何使用带有嵌套对象的@Jsonview 进行序列化【英文标题】:How to serialize using @Jsonview with nested objects 【发布时间】:2014-06-09 05:46:14 【问题描述】:我有一个类包含另一个类的集合。
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。
有办法实现吗?
【问题讨论】:
***.com/questions/15521601/… Thansk Anathna,这可能行不通,我需要像 field1:"blah",field2:"blah", bEntities:[field2:"bleh"] 这样的结果,但使用对象映射器将导致 field1:"blah",field2:"blah", bEntities:[field2:"bleh",field3:"bleh"] 【参考方案1】:这解决了我的问题。我不确定是否有更好的方法来解决这个问题。
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;
【讨论】:
【参考方案2】:在遇到同样的问题后,我想出了这个解决方案:
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。
【讨论】:
【参考方案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。
【讨论】:
以上是关于如何使用带有嵌套对象的@Jsonview 进行序列化的主要内容,如果未能解决你的问题,请参考以下文章
Java - 如何反序列化带有嵌套对象和列表的 JSON 数组? [复制]