如何让Jackson兼容解析String字段与List<String>字段?
解决Jackson兼容单String与List解析的问题
针对数据库中同时存在单String和List
方案一:启用Jackson内置特性
直接给ObjectMapper开启ACCEPT_SINGLE_VALUE_AS_ARRAY特性,Jackson会自动将单个值包装为集合类型,无需修改实体类代码:
public <T> T parse(String s, Class<T> clazz) { try { ObjectMapper objectMapper = new ObjectMapper(); // 开启单值转数组特性 objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); return objectMapper.readValue(s, clazz); } catch (JsonProcessingException e) { // 异常处理逻辑 e.printStackTrace(); return null; } }
这个特性会全局生效,所有期望是集合/数组类型的字段,遇到单值JSON时都会自动兼容。
方案二:自定义字段反序列化器
如果只需要针对特定字段做兼容,或者需要更灵活的处理逻辑,可以自定义反序列化器并绑定到目标字段:
1. 编写自定义反序列化器
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class StringToListDeserializer extends JsonDeserializer<List<String>> { @Override public List<String> deserialize(JsonParser parser, DeserializationContext context) throws IOException { JsonNode node = parser.getCodec().readTree(parser); List<String> result = new ArrayList<>(); if (node.isTextual()) { // 单字符串格式,直接转为单元素列表 result.add(node.asText()); } else if (node.isArray()) { // 数组格式,遍历解析每个元素 for (JsonNode element : node) { if (element.isTextual()) { result.add(element.asText()); } } } return result; } }
2. 在实体类字段上绑定反序列化器
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import java.util.List; public class TestClass { @JsonDeserialize(using = StringToListDeserializer.class) private List<String> field; // 此处添加getter、setter方法 }
这种方式仅对标注了注解的字段生效,适合局部兼容场景。
内容的提问来源于stack exchange,提问作者Arzybek
相关产品推荐
相关产品推荐

