Java开发中如何解析可同时为String或List<String>的JSON字段
适配String/List混合类型字段的Java JSON序列化方案
方案1:启用Jackson内置单值转数组特性(推荐,无额外编码)
Jackson原生支持将单个值自动封装为数组类型,只需要做简单配置即可:
- 局部字段配置(仅对当前字段生效,无全局副作用)
在column字段上添加@JsonFormat注解:
@Data public class NonNullRatio extends Constraint { @NonNull @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) private List<String> column; @NonNull private Assertion assertion; }
- 全局配置(对所有数组类字段生效)
配置ObjectMapper全局参数:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
方案2:自定义序列化/反序列化器(适合有特殊逻辑的场景)
如果需要额外的校验、过滤等自定义逻辑,可以自己实现适配的序列化/反序列化器:
反序列化适配(JSON转Java对象)
首先实现自定义反序列化类:
public class StringToListDeserializer extends JsonDeserializer<List<String>> { @Override public List<String> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { // 匹配数组类型输入 if (jsonParser.currentToken() == JsonToken.START_ARRAY) { return jsonParser.readValueAs(new TypeReference<List<String>>() {}); } // 匹配单字符串输入,包装为单元素List return Collections.singletonList(jsonParser.getValueAsString()); } }
然后在字段上指定使用该反序列化器:
@Data public class NonNullRatio extends Constraint { @NonNull @JsonDeserialize(using = StringToListDeserializer.class) private List<String> column; @NonNull private Assertion assertion; }
序列化适配(Java对象转JSON)
如果需要把单元素的List<String>序列化为单个字符串而非数组,可以补充自定义序列化类:
public class ListToStringSerializer extends JsonSerializer<List<String>> { @Override public void serialize(List<String> value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { if (value.size() == 1) { jsonGenerator.writeString(value.get(0)); return; } jsonGenerator.writeObject(value); } }
在字段上添加序列化器注解即可:
@JsonSerialize(using = ListToStringSerializer.class) @JsonDeserialize(using = StringToListDeserializer.class) private List<String> column;
内容的提问来源于stack exchange,提问作者Shiv
相关产品推荐
相关产品推荐

