创建自定义杰克逊注解 [英] Create a custom Jackson annotation

查看:159
本文介绍了创建自定义杰克逊注解的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

一个项目需要使用杰克逊的以下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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆