복붙노트

[SPRING] 중첩 된 객체와 @Jsonview 사용하여 직렬화하는 방법

SPRING

중첩 된 객체와 @Jsonview 사용하여 직렬화하는 방법

나는 다른 클래스의 컬렉션을 보유하는 클래스를 가지고있다.

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

내가 클래스 A가 VerboseViewA.Complete를 사용하여 직렬화 할 때, 내가 수집 bEntities가 VerboseViewB.Minimal을 사용하여 직렬화 할.

그것을 달성하는 방법이 있나요?

해결법

  1. ==============================

    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. ==============================

    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는 JsonView를 오버라이드 (override), 사용자 정의 VerboseMinimalSerializer를 사용하여 포함 직렬화됩니다

    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. ==============================

    3.당신은 당신의 JSON 뷰 계층 구조를 약간 변경해야합니다 :

    당신은 당신의 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 속성을 취할 것입니다.

  4. from https://stackoverflow.com/questions/23260464/how-to-serialize-using-jsonview-with-nested-objects by cc-by-sa and MIT license