Jackson@JsonCreator 注解

Posted 绝世好阿狸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jackson@JsonCreator 注解相关的知识,希望对你有一定的参考价值。

该注解用在对象的反序列时指定特定的构造函数或者工厂方法。在反序列化时,Jackson默认会调用对象的无参构造函数,如果我们不定义任何构造函数,Jvm会负责生成默认的无参构造函数。但是如果我们定义了构造函数,并且没有提供无参构造函数时,Jackson会报错:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.liyao.model.Person` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (String)""age":1,"name":"ly","address":["1","2","3"]"; line: 1, column: 2]

再回到@JsonCreator注解,其作用就是,指定对象反序列化时的构造函数或者工厂方法,如果默认构造函数无法满足需求,或者说我们需要在构造对象时做一些特殊逻辑,可以使用该注解。该注解需要搭配@JsonProperty使用。

举例:

public class Person 

    private int age;
    private String name;

    @JsonCreator
    public Person(@JsonProperty("age") int age, @JsonProperty("name") String name) 
        this.age = age;
        this.name = name;
    

如上是只用@JsonCreator注解的例子,可以直接反序列化。

如果不使用该注解,那么需要提供无参构造函数以及对应的setter方法:

public class Person 

    private int age;
    private String name;

    public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

当然二者可以协同使用,就是在@JsonCreator方法里提供部分属性的初始化方法,剩余的通过setter方法提供,建议只选一种。

推荐使用@JsonCreator注解提供反序列化方法,这样表意更清晰,减少了类的方法数目。

但是需要注意:

@JsonCreator只能用在静态方法或者构造方法,实例方法是不行的!!!因为还没构造出对象。

 

另外,类似的还有一个@ConstructorProperties注解也是类似的,不过只能用在构造函数里。

再贴一个例子:

public class ConfigModel 

    private long id;
    private String name;

    /**
     * 方式一:使用static方法,需要将入参使用@JsonProperty("xxx")注解标注,jackson才能知道属性怎么对应
     */
    @JsonCreator
    public static ConfigModel create(@JsonProperty("id") long id, @JsonProperty("name") String name) 
        ConfigModel model = new ConfigModel();
        model.setId(id);
        model.setName(name);
        System.out.println("factory");
        return model;
    

    /**
     * 方式二:使用构造方法,同样需要将入参使用@JsonProperty("xxx")注解标注
     */
    @JsonCreator
    public ConfigModel(@JsonProperty("id") long id, @JsonProperty("name") String name) 
        ConfigModel model = new ConfigModel();
        model.setId(id);
        model.setName(name);
        System.out.println("constructor1");
    

    /**
     * 方式三:使用构造方法,使用ConstructorProperties注解标识属性顺序,无需再使用@JsonProperty
     */
    @ConstructorProperties("id", "name")
    public ConfigModel(long id, String name) 
        ConfigModel model = new ConfigModel();
        model.setId(id);
        model.setName(name);
        System.out.println("constructor2");
    

    public ConfigModel() 
        // default
    

    public long getId() 
        return id;
    

    public void setId(long id) 
        this.id = id;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

 

以上是关于Jackson@JsonCreator 注解的主要内容,如果未能解决你的问题,请参考以下文章

Spring/Spring学习 自动装配@Autowired 和 @Resource

《机器学习实战》问题记录

Spring aop 简单示例

MapReduce获取分片数目

MapReduce 编程 系列九 Reducer数目

readfq 软件的安装 统计 reads的数目及碱基数目