How to serialize using @Jsonview with nested objects

前端 未结 3 1361
Happy的楠姐
Happy的楠姐 2021-01-04 08:49

I have a class which holds a collection of another class.

class A{
 @JsonView(VerboseViewA.Minimal.class)
 String field1;
 @JsonView(VerboseViewA.Complete.c         


        
相关标签:
3条回答
  • 2021-01-04 09:16

    you need to change your json view hierachy a little:

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

    then you can annotate your classes like

    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;
    }
    

    when you serialize using the view AComplete, the serializer will take the AComplete and MinimalView properties because AComplete extends MinimalView.

    0 讨论(0)
  • 2021-01-04 09:20

    This solves my problem. I ain't sure if there is a better way to solve this.

     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;
     }
    
    0 讨论(0)
  • 2021-01-04 09:30

    After struggling with the same problem, I came up to this solution:

    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;
    }
    

    Now when serializing an instance of class A using VerboseViewA.Complete.class, bEnitities will be included and serialized using a custom VerboseMinimalSerializer, overriding its 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);
        }
    }
    

    Notice this custom serializer is using the view VerboseViewB.Minimal.class.

    0 讨论(0)
提交回复
热议问题