首页 > 解决方案 > 从 CBOR ByteArray 中检索数据

问题描述

我正在尝试使用 Jackson CBOR 数据格式库将映射序列化为 Kotlin 中的 CBOR,如果键是 String ,这可以正常工作,我可以轻松检索该键的值,但是当 Int 中的键时,它返回 null 给我对于我所做的每一次获取,如果我打印出 values() 的输出,它会为我提供所有键的所有值。

代码如下所示:

val mapper = CBORMapper()
val map = HashMap<Any,Any>()
map[123] = intArrayOf(22,67,2)
map[456] = intArrayOf(34,12,1)
val cborData = mapper.writeValueAsBytes(map)
println(cborData.toHex())
val deserialized = mapper.readValue(cborData, HashMap<Any,Any>().javaClass)
println(deserialized.get(123)) // returns null
println(values()) // returns all values

标签: kotlinserializationjacksoncbor

解决方案


尝试遍历键并检查类型:

deserialized.keys.iterator().next().javaClass

上面的代码,在你的情况下应该打印:

123 - class java.lang.String
456 - class java.lang.String

和:

println(deserialized.get("123"))

印刷:

[22, 67, 2]

看看文档

模块扩展了标准的 Jackson 流 API(JsonFactory、JsonParser、JsonGenerator),因此可以与所有更高级别的数据抽象(数据绑定、树模型和可插入扩展)无缝协作。

您可以使用以下方法强制类型Kotlin's readValue

import com.fasterxml.jackson.module.kotlin.readValue

并像这样使用它:

val deserialized = mapper.readValue<Map<Int, IntArray>>(cborData)
deserialized.keys.forEach { key -> println("$key - ${key.javaClass}") }
println(Arrays.toString(deserialized[123]))

上面的代码打印:

456 - int
123 - int
[22, 67, 2]

也可以看看:


推荐阅读