我需要根据自定义忽略注释忽略我的Json对象中的某些属性,我只需要某个对象映射器。但是,对于其他情况,我需要JsonProperty注释。我正在使用JacksonAnnotationInstrospector来做到这一点。但是当我这样做时,这两个注释都没有得到承认。
例如,我希望我的输出是这样的:
普通对象映射器:{"element3":"C","element_1":"A","element_2":"B"}
使用带有JacksonAnnotationInstrospector的Object mapper的预期输出:{"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 :(得分:1)
您应该在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 {
}
}
答案 1 :(得分:0)
我不确定我是否理解您的用例。为什么您需要在您忽略的属性上命名? 如果问题与反序列化有关,并且反序列化由于找不到具有特定名称的所需属性而失败,则可以将对象映射器配置为忽略未知属性。示例如下。
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)