创建自定义杰克逊注解 [英] Create a custom Jackson annotation
本文介绍了创建自定义杰克逊注解的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
一个项目需要使用杰克逊的以下combinaison注释在一起了很多。那么,有没有一种方法来创建另一个注解,以避免难看的复制/粘贴:
公共类A {
@JsonProperty(_ ID)
@JsonSerialize(使用= IdSerializer.class)
@JsonDeserialize(使用= IdDeserializer.class)
字符串ID;
}公共类B {
@JsonProperty(_ ID)
@JsonSerialize(使用= IdSerializer.class)
@JsonDeserialize(使用= IdDeserializer.class)
字符串ID;
}公共C类{
@CustomId //不要重复配置不休
字符串ID;
}
更新:我试过这个,没有成功: - (
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonProperty(_ ID)
@JsonSerialize(使用= IdSerializer.class,包括= JsonSerialize.Inclusion.NON_NULL)
@JsonDeserialize(使用= IdDeserializer.class)
公共@interface标识{}ð公共类{
@ID
私人字符串ID;
}
解决方案
使用 @JacksonAnnotationsInside
的解决这个问题:
公共类JacksonTest { @Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonProperty(_ ID)
@JsonSerialize(使用= IdSerializer.class,包括= Inclusion.NON_NULL)
@JsonDeserialize(使用= IdDeserializer.class)
公共@interface标识{
} 公共静态类答案{
@ID
字符串ID;
字符串名称; 公共答(){}
} @测试
公共无效TestInside测试()抛出IOException
ObjectMapper映射器=新ObjectMapper();
VisibilityChecker<>检查= mapper.getSerializationConfig()getDefaultVisibilityChecker()。
mapper.setVisibilityChecker(checker.withFieldVisibility(JsonAutoDetect.Visibility.ANY)); 串串={'名':'约翰','_id':{'子':'47cc'}}替换('\\'','');
答案answer = mapper.reader(Answer.class).readValue(字符串);
Assertions.assertThat(answer.id).isEqualTo(47cc);
}
}
A project needs to use the following combinaison of Jackson annotations together a lot. So, is there a way to create another annotation to avoid ugly copy/paste:
public class A {
@JsonProperty("_id")
@JsonSerialize(using=IdSerializer.class)
@JsonDeserialize(using=IdDeserializer.class)
String id;
}
public class B {
@JsonProperty("_id")
@JsonSerialize(using=IdSerializer.class)
@JsonDeserialize(using=IdDeserializer.class)
String id;
}
public class C {
@CustomId // don't repeat that configuration endlessly
String id;
}
Update: I've tried this, without success :-(
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonProperty("_id")
@JsonSerialize(using=IdSerializer.class, include=JsonSerialize.Inclusion.NON_NULL)
@JsonDeserialize(using=IdDeserializer.class)
public @interface Id {}
public class D {
@Id
private String id;
}
解决方案
The use of @JacksonAnnotationsInside
solve the problem:
public class JacksonTest {
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonProperty("_id")
@JsonSerialize(using=IdSerializer.class, include=Inclusion.NON_NULL)
@JsonDeserialize(using=IdDeserializer.class)
public @interface Id {
}
public static class Answer {
@Id
String id;
String name;
public Answer() {}
}
@Test
public void testInside() throws IOException {
ObjectMapper mapper = new ObjectMapper();
VisibilityChecker<?> checker = mapper.getSerializationConfig().getDefaultVisibilityChecker();
mapper.setVisibilityChecker(checker.withFieldVisibility(JsonAutoDetect.Visibility.ANY));
String string = "{ 'name' : 'John' , '_id' : { 'sub' : '47cc'}}".replace('\'', '"');
Answer answer = mapper.reader(Answer.class).readValue(string);
Assertions.assertThat(answer.id).isEqualTo("47cc");
}
}
这篇关于创建自定义杰克逊注解的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文