Jackson:处理Kotlin/Java中缺失List字段的反序列化问题
Jackson反序列化缺失字段时生成空列表(Kotlin + Java 实现)
Kotlin 场景解决方法
问题还原
定义了非空List<Int>类型prices字段的Kotlin数据类,当JSON缺失该字段时,Jackson会抛出MissingKotlinParameterException——因为Kotlin非空参数不允许接收null值。
解决方案
最简洁的方式是给数据类的prices参数设置默认空列表,Jackson的Kotlin模块会自动识别并使用默认值填充缺失字段:
data class Product(val name: String, val prices: List<Int> = emptyList()) // 测试代码 val json = """{"name": "Computer"}""" val mapper = ObjectMapper().registerKotlinModule() val product = mapper.readValue<Product>(json) println(product) // 输出:Product(name=Computer, prices=[])
若无法修改数据类,可通过自定义反序列化器处理null转空列表,但默认参数方案更直观高效。
Java 场景解决方法
问题还原
Java类的构造函数接收List<Integer>类型的prices参数,当JSON缺失该字段时,Jackson会将其设为null,而非期望的空列表。
解决方案
方案1:构造函数内处理null值
直接在构造函数中判断,若传入的prices为null则替换为空列表:
class Product { private String name; private List<Integer> prices; public Product(String name, List<Integer> prices) { this.name = name; this.prices = prices == null ? new ArrayList<>() : prices; } @Override public String toString() { return "Product{name='" + name + "\", prices=" + prices + '}'; } } // 测试代码 String json = "{\"name\": \"Computer\"}"; ObjectMapper mapper = new ObjectMapper().registerModule(new ParameterNamesModule()); Product product = mapper.readValue(json, Product.class); System.out.println(product); // 输出:Product{name='Computer', prices=[]}
方案2:全局配置Jackson自动填充空集合
启用Jackson的DEFAULT_READ_VALUE_AS_EMPTY_COLLECTION特性,让所有缺失的集合类型字段自动填充为空集合,适合全局统一处理场景:
String json = "{\"name\": \"Computer\"}"; ObjectMapper mapper = new ObjectMapper() .registerModule(new ParameterNamesModule()) .enable(DeserializationFeature.DEFAULT_READ_VALUE_AS_EMPTY_COLLECTION); Product product = mapper.readValue(json, Product.class); System.out.println(product); // 输出:Product{name='Computer', prices=[]}
内容的提问来源于stack exchange,提问作者Devabc
相关产品推荐
相关产品推荐

