使用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
相关产品推荐
相关产品推荐

