美文网首页
Jackson全面解析--注解全讲解四(@JsonCreator

Jackson全面解析--注解全讲解四(@JsonCreator

作者: 牧羊人刘俏 | 来源:发表于2020-11-27 16:15 被阅读0次

    @JsonCreator

    Jackson在反序列化的时候,会使用实体的默认无参构造函数来实例化一个对象,然后使用对象的setter方法来初始化属性值,如果没有定义无参构造函数会发生什么呢,我们来看下

     @AllArgsConstructor
        @Getter
        @Setter
        class Player{
    
            String name;
            int age;
    
        }
    测试代码如下
    @Test
        public void JsonCreatorTest() throws Exception{
    
            CombineJacksonAnnotation.Player player  = om.readValue("{\n" +
                    "  \"name\" : \"tom\",\n" +
                    "  \"age\" : 12" +
                    "}",CombineJacksonAnnotation.Player.class);
    
        }
    运行之后,会看到Jackson报错
    com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.ittx.cbt.report.service.jackson.CombineJacksonAnnotation$Player` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
    

    根据提示可以看到,在反序列化对象的时候,要提供默认的无参构造函数,或是
    delegate- or property-based Creator。
    所以我们可以使用@JsonCreator来指定反序列化时候的构造函数,如下

     @AllArgsConstructor
        @Getter
        @Setter
        class Player{
    
            @JsonCreator
            public Player(@JsonProperty("name") String name){
    
                this.name = name;
                this.age =10;
                System.out.println("test case");
    
            }
    
            String name;
            int age;
    
        }
    

    再次运行测试代码,结果如下


    image.png

    可以看到不报错了,虽然我们在反序列化时候,实例化一个Player的时候将age初始化成了10,但是Jackson会继续的使用setter方法将其赋值为12,注意在使用@JsonCreator指定反序列化构造函数时,参数一定要使用@JsonProperty指定Json key的名称。

    @JsonEnumDefaultValue

    此注解比较简单,可以在反序列化枚举时指定默认的value,如下

        enum Animal{
    
            DOG,
    
            @JsonEnumDefaultValue
            CAT;
        }
    

    测试代码如下


    image.png

    可以看到成功的反序列化到了DOG对象,但是如果我们改下代码


    image.png
    可以看到当反序列化找不到对象的时候,成功的反序列化成了CAT,注意此注解要生效,记得加上
    om.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE);
    

    当人我们可以使用前面讲的@JsonCreator来指定反序列化的构造方法,代码如下

     enum Animal{
    
            DOG,
    
            @JsonEnumDefaultValue
            CAT;
    
            @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
            public static Animal animalValueOf( String type){
    
                if(type.equals("dog")){
    
                    return DOG;
    
                }
    
                return null;
    
            }
    
    
        }
    

    继续运行代码


    image.png

    可以看到这个时候animal被反序列化成了null,个人建议使用@JsonCreator来反序列化枚举对象,这个灵活性和可控性更强。

    相关文章

      网友评论

          本文标题:Jackson全面解析--注解全讲解四(@JsonCreator

          本文链接:https://www.haomeiwen.com/subject/iddxwktx.html