使用Rest Assured时如何通过POJO构造JSON中的空数组
空数组序列化问题解决方案
问题根因
你当前代码存在两个核心问题:
- 类型不匹配:
Key是List<String>类型,直接赋值字符串""会触发序列化框架的隐式类型转换,把字符串转为单元素列表,最终得到[""]的错误结果 - 空值处理逻辑不符:赋值为
null时,序列化框架默认会把字段输出为null或者直接省略,不会自动转为空数组
具体实现方案
以下是常用Java JSON序列化框架的适配方案:
方案1:Jackson(Spring生态默认序列化框架)
方式一:直接初始化空集合(推荐,改造成本最低)
直接在POJO定义或者赋值时给Key赋值空集合,不用额外配置:
public class Sample { // 初始化时直接赋值空集合,避免null值 private List<String> Key = new ArrayList<>(); } // 测试代码 Sample s = new Sample(); // 不需要给Key额外赋值,保持默认空集合即可 // 如果需要手动设置为空,可显式赋值:s.setKey(Collections.emptyList());
序列化后自动得到"Key": []的预期结果。
方式二:自定义序列化器适配null转空数组
如果需要兼容Key为null的业务场景,不用修改赋值逻辑,加序列化注解即可:
- 先定义空数组序列化器:
public class NullListToEmptyArraySerializer extends JsonSerializer<List<?>> { @Override public void serialize(List<?> value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value == null) { // 空值直接输出空数组 gen.writeStartArray(); gen.writeEndArray(); return; } gen.writeObject(value); } }
- 在POJO字段上标注注解:
public class Sample { @JsonSerialize(nullsUsing = NullListToEmptyArraySerializer.class) private List<String> Key; }
方案2:Fastjson
方式一:直接初始化空集合
和Jackson的方式一逻辑一致,给Key赋值new ArrayList<>()或者Collections.emptyList()即可得到预期结果。
方式二:全局配置null列表转空数组
如果要全局适配所有List类型的null值序列化为空数组,配置序列化规则即可:
SerializeConfig serializeConfig = new SerializeConfig(); serializeConfig.put(List.class, (ObjectSerializer) (serializer, object, fieldName, fieldType, features) -> { if (object == null) { serializer.out.writeStartArray(); serializer.out.writeEndArray(); return; } serializer.write(object); }); // 序列化时传入配置 String resultJson = JSON.toJSONString(sample, serializeConfig);
注意事项
需要确认序列化框架开启了「输出空集合」的特性:
- Jackson需要开启
SerializationFeature.WRITE_EMPTY_JSON_ARRAYS(默认已开启) - Fastjson可配置
SerializerFeature.WriteNullListAsEmpty实现null列表直接输出空数组
内容的提问来源于stack exchange,提问作者Karthick sankar
相关产品推荐
相关产品推荐

