2017-08-24 155 views
1

我需要忽略我的Json對象中的某些屬性基於自定義Ignore註釋,我只需要一個特定的對象映射器。但是,對於其他情況,我需要JsonProperty註釋。我正在使用JacksonAnnotationInstrospector來做到這一點。但是當我這樣做時,沒有任何註釋得到承認。@JsonIgnore和@JsonProperty在相同的屬性

舉例來說,我希望我的輸出是這樣的:

普通對象映射:{"element3":"C","element_1":"A","element_2":"B"}

使用對象映射器與JacksonAnnotationInstrospector

預期輸出:{"element_1":"A"}

輸出其實我與JacksonAnnotationInstrospector獲得: {"element2":"B","element_1":"A"}

以下是我的代碼:

public class TestClass { 

    public static void main(String[] args) throws Exception { 

     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.setAnnotationIntrospector(new JsonIgnoreIntrospector()); 

     MockObject mockObject = new MockObject("A", "B", "C"); 
     String string = objectMapper.writeValueAsString(mockObject); 
     System.out.println(string); 
    } 

    public static class MockObject { 

     @JsonProperty("element_1") 
     String element1; 

     @CustomJsonIgnore 
     @JsonProperty("element_2") 
     String element2; 

     @CustomJsonIgnore 
     String element3; 

     public MockObject(String element1, String element2, String element3) { 
      this.element1 = element1; 
      this.element2 = element2; 
      this.element3 = element3; 
     } 

     public String getElement1() { 
      return element1; 
     } 

     public void setElement1(String element1) { 
      this.element1 = element1; 
     } 

     public String getElement2() { 
      return element2; 
     } 

     public void setElement2(String element2) { 
      this.element2 = element2; 
     } 

     public String getElement3() { 
      return element3; 
     } 

     public void setElement3(String element3) { 
      this.element3 = element3; 
     } 
    } 

    public static class JsonIgnoreIntrospector extends JacksonAnnotationIntrospector { 
     @Override 
     public boolean hasIgnoreMarker(final AnnotatedMember m) { 
      return m.hasAnnotation(CustomJsonIgnore.class) || m.hasAnnotation(JsonIgnore.class); 
     } 

    } 

    @Retention(RetentionPolicy.RUNTIME) 
    @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.CONSTRUCTOR}) 
    @JacksonAnnotation 
    public @interface CustomJsonIgnore { 
    } 
} 

回答

0

您應該在getter上而不是在字段上使用註釋。並且在註解目標中添加METHOD。

工作液:

public class TestClass { 

    public static void main(String[] args) throws Exception { 

     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.setAnnotationIntrospector(new JsonIgnoreIntrospector()); 

     MockObject mockObject = new MockObject("A", "B", "C"); 
     String string = objectMapper.writeValueAsString(mockObject); 
     System.out.println(string); 
    } 

    public static class MockObject { 

     String element1; 

     String element2; 

     String element3; 

     public MockObject(String element1, String element2, String element3) { 
      this.element1 = element1; 
      this.element2 = element2; 
      this.element3 = element3; 
     } 

     @JsonProperty("element_1") 
     public String getElement1() { 
      return element1; 
     } 

     public void setElement1(String element1) { 
      this.element1 = element1; 
     } 

     @CustomJsonIgnore 
     @JsonProperty("element_2") 
     public String getElement2() { 
      return element2; 
     } 

     public void setElement2(String element2) { 
      this.element2 = element2; 
     } 

     @CustomJsonIgnore 
     public String getElement3() { 
      return element3; 
     } 

     public void setElement3(String element3) { 
      this.element3 = element3; 
     } 
    } 

    public static class JsonIgnoreIntrospector extends JacksonAnnotationIntrospector { 
     @Override 
     public boolean hasIgnoreMarker(final AnnotatedMember m) { 
      return m.hasAnnotation(CustomJsonIgnore.class) || m.hasAnnotation(JsonIgnore.class); 
     } 

    } 

    @Retention(RetentionPolicy.RUNTIME) 
    @Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, 
      ElementType.CONSTRUCTOR }) 
    @JacksonAnnotation 
    public @interface CustomJsonIgnore { 
    } 
} 
相關問題