使用Jackson将JSON数组反序列化为POJO时遭遇构造器缺失错误的技术求助
解决Jackson反序列化"No Creators exist"报错的方案
嘿,这个问题我之前也踩过坑!咱们一步步来搞定它:
首先得明确两个关键问题:你的JSON格式有语法错误,以及Jackson找不到合适的构造器来创建Students实例,这两个点都得修正才能正常运行。
先修正JSON字符串的错误
你写的{"name" : [{"John" , "Mark"}]}是非法的JSON:
- 数组里的字符串元素需要用双引号包裹,元素间用逗号分隔
- 你把数组写成了包含一个非法对象
{"John", "Mark"}(对象必须是键值对格式)
正确的JSON应该是这样:
String json = "{\"name\" : [\"John\", \"Mark\"]}"; // 或者Java 15+用文本块更清晰: String json = """ {"name" : ["John", "Mark"]} """;
解决构造器缺失的问题
报错No Creators, like default constructor, exist的核心原因是:Jackson默认需要通过无参构造器创建POJO实例,再用Setter方法给字段赋值;但你的Students类只定义了带参构造器,Jackson不知道怎么实例化对象。
这里有三种常用的解决方案:
方案1:添加无参构造器+Getter/Setter
这是最通用的做法,给Students类补充无参构造器,以及字段的Getter和Setter方法:
public class Students { String[] name; // 新增无参构造器 public Students() {} public Students(String[] name) { this.name = name; } // 新增Getter和Setter public String[] getName() { return name; } public void setName(String[] name) { this.name = name; } }
Jackson会先调用无参构造创建对象,再通过setName方法把JSON里的数组赋值给字段。
方案2:用@JsonCreator和@JsonProperty注解指定带参构造器
如果不想加无参构造器,可以通过注解告诉Jackson直接使用你的带参构造器:
import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; public class Students { String[] name; @JsonCreator // 标记这是Jackson可用的构造器 public Students(@JsonProperty("name") String[] name) { // @JsonProperty指定JSON中的"name"字段映射到这个构造参数 this.name = name; } // 可选:添加Getter方便后续业务使用 public String[] getName() { return name; } }
这样Jackson会直接调用这个带参构造器,把JSON里的"name"数组传入创建实例。
方案3:用Lombok简化代码(如果项目中使用Lombok)
如果你的项目已经引入了Lombok,可以用@Data注解自动生成无参构造器、Getter、Setter等方法,代码会非常简洁:
import lombok.Data; @Data public class Students { String[] name; }
@Data注解会帮你生成所有Jackson需要的方法,不需要手动写构造器和Getter/Setter。
把这两个问题(JSON格式+构造器)都处理完,你的反序列化代码就能正常运行啦!
内容的提问来源于stack exchange,提问作者RthFd
相关产品推荐
相关产品推荐

