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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:39:03