Java使用Jackson反序列化JSON时,字符串转List<String>失败求助
解决Jackson反序列化字符串形式数组为List的问题
问题原因
你的JSON中listField的值是字符串类型的JSON数组(被双引号包裹),而非原生的JSON数组。Jackson默认只会把原生JSON数组反序列化为List,遇到字符串类型的数组就会抛出类型不匹配的异常。
解决方案
方案1:自定义JSON反序列化器
编写一个自定义的反序列化器,将字符串形式的数组解析为List<String>,然后通过注解指定给目标字段。
- 实现自定义反序列化器:
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.List; public class StringToListDeserializer extends JsonDeserializer<List<String>> { private static final ObjectMapper mapper = new ObjectMapper(); @Override public List<String> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { // 获取字符串形式的数组内容 String arrayStr = p.getText(); // 将字符串解析为List<String> return mapper.readValue(arrayStr, List.class); } }
- 在实体类的
listField上添加注解指定反序列化器:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; public class Example { @JsonProperty("stringField") private String stringField; @JsonProperty("listField") @JsonDeserialize(using = StringToListDeserializer.class) private List<String> listField; // 添加上getter和setter方法 public String getStringField() { return stringField; } public void setStringField(String stringField) { this.stringField = stringField; } public List<String> getListField() { return listField; } public void setListField(List<String> listField) { this.listField = listField; } }
方案2:通过Setter方法手动解析
如果不想写自定义反序列化器,可以在实体类中添加一个接收String类型的Setter方法,手动将字符串解析为List。
修改实体类:
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; public class Example { @JsonProperty("stringField") private String stringField; private List<String> listField; @JsonProperty("listField") public void setListField(String listStr) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); this.listField = mapper.readValue(listStr, List.class); } // 保留原有的getter和其他Setter public String getStringField() { return stringField; } public void setStringField(String stringField) { this.stringField = stringField; } public List<String> getListField() { return listField; } }
方案3:修改原始JSON格式(若可行)
如果能控制原始JSON的生成,直接将listField改为原生JSON数组(去掉外层双引号),Jackson就能自动反序列化为List<String>:
{ "stringField": "abc", "listField": ["item1", "item2", "item3"] }
内容的提问来源于stack exchange,提问作者rand om
相关产品推荐
相关产品推荐

