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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:36:18