You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java使用Jackson反序列化JSON时,字符串转List<String>失败求助

解决Jackson反序列化字符串形式数组为List的问题

问题原因

你的JSON中listField的值是字符串类型的JSON数组(被双引号包裹),而非原生的JSON数组。Jackson默认只会把原生JSON数组反序列化为List,遇到字符串类型的数组就会抛出类型不匹配的异常。

解决方案

方案1:自定义JSON反序列化器

编写一个自定义的反序列化器,将字符串形式的数组解析为List<String>,然后通过注解指定给目标字段。

  1. 实现自定义反序列化器:
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);
    }
}
  1. 在实体类的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:52:22