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

使用Jackson CBOR库序列化Kotlin Map时Int类型键取值为null如何解决

问题原因

Jackson 默认序列化/反序列化 Map 结构时,会将所有非字符串类型的键统一转换为 String 类型存储。你原始 Map 中存入的是 Int 类型的键123、456,反序列化后对应的键已经变成了字符串"123"、"456",用 Int 类型的键去查询自然返回 null,而values()方法不校验键,所以可以正常输出所有值。

解决方案

通过指定TypeReference保留泛型信息,同时配置 CBORMapper 支持数值类型的键,示例代码如下:

import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.dataformat.cbor.CBORMapper
import com.fasterxml.jackson.core.type.TypeReference

val mapper = CBORMapper().apply {
    // 反序列化时将整数类型的键保留为数值类型
    enable(DeserializationFeature.USE_BIG_INTEGER_FOR_INTS)
}

val map = HashMap<Any,Any>()
map[123] = intArrayOf(22,67,2)
map[456] = intArrayOf(34,12,1)
val cborData = mapper.writeValueAsBytes(map)

// 用TypeReference保留Map的泛型信息,避免类型擦除导致Jackson默认转String键
val deserialized = mapper.readValue(cborData, object : TypeReference<HashMap<Any, Any>>() {})

println(deserialized[123]) // 可正常输出对应数组

如果不想调整配置,也可以直接用字符串形式的键取值:deserialized["123"],但这种方式类型安全性较差,不推荐使用。

内容的提问来源于stack exchange,提问作者Yasin Eraslan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:18:02