
本文旨在解决在使用 Jackson 反序列化 JSON 数据时,遇到的将原本的 String 字段转换为 List
在使用 Jackson 进行 JSON 反序列化时,经常会遇到数据结构变更的情况。例如,原本的 String 字段需要变更为 List
方案一:使用 @JsonFormat 注解
@JsonFormat 注解是 Jackson 提供的一个非常强大的注解,可以用于控制序列化和反序列化的行为。针对本文的问题,我们可以使用 @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) 来指示 Jackson 在反序列化时,如果遇到单个值,则将其作为数组的单个元素进行处理。
具体使用方法如下:
import com.fasterxml.jackson.annotation.JsonFormat;
public class TestClass {
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
private List field;
public List getField() {
return field;
}
public void setField(List field) {
this.field = field;
}
} 通过在 field 字段上添加 @JsonFormat 注解,Jackson 在反序列化时,如果遇到以下两种情况:
- "field": "someValue":Jackson 会将其解析为 List
,其中包含一个元素 "someValue"。 - "field": ["value1", "value2"]:Jackson 会将其解析为 List
,其中包含两个元素 "value1" 和 "value2"。
这样,无论数据库中的数据是旧的 String 类型还是新的 List
注意事项:
- 确保引入了 Jackson 的相关依赖。
- @JsonFormat 注解可以用于控制其他序列化和反序列化的行为,例如日期格式等。
方案二:配置 ObjectMapper
如果无法直接修改实体类,例如实体类来自于第三方库,或者出于其他原因不想在实体类上添加注解,那么可以通过配置 ObjectMapper 来达到相同的效果。
具体方法如下:
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonConfig {
public static ObjectMapper configureObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
return objectMapper;
}
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = configureObjectMapper();
String jsonString1 = "{\"field\": \"someValue\"}";
String jsonString2 = "{\"field\": [\"value1\", \"value2\"]}";
TestClass testClass1 = objectMapper.readValue(jsonString1, TestClass.class);
TestClass testClass2 = objectMapper.readValue(jsonString2, TestClass.class);
System.out.println(testClass1.getField()); // 输出: [someValue]
System.out.println(testClass2.getField()); // 输出: [value1, value2]
}
}通过调用 objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY),我们告诉 ObjectMapper 在反序列化时,接受单个值作为数组。这样,即使没有在实体类上添加 @JsonFormat 注解,也可以正确地处理新旧数据格式。
注意事项:
- DeserializationFeature 类包含了许多其他的反序列化配置选项,可以根据实际需求进行配置。
- 建议将 ObjectMapper 配置为单例模式,避免重复创建,提高性能。
总结
本文介绍了两种解决 Jackson 反序列化 String 字段到 List










