如何使用带有嵌套对象的@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 数组? [复制]

JsonView 返回空的 json 对象

@JsonView 简单介绍[z]

反序列化时需要一个列表,但得到一个带有嵌套对象的类 java.util.HashMap

spring boot 之@JsonView 简单介绍

使用嵌套对象和中间步骤进行反序列化