从 CBOR ByteArray 中检索数据

Retrieving data from CBOR ByteArray

我正在尝试使用 Jackson CBOR 数据格式库将映射序列化为 Kotlin 中的 CBOR,如果键是 String ,这工作正常,我可以轻松检索该键的值,但是当键为 Int 时,它 returns 我做的每一次获取对我来说都是空的,如果我打印出 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

尝试遍历键并检查类型:

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

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

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

并且:

println(deserialized.get("123"))

打印:

[22, 67, 2]

看看 documentation:

Module extends standard Jackson streaming API (JsonFactory, JsonParser, JsonGenerator), and as such works seamlessly with all the higher level data abstractions (data binding, tree model, and pluggable extensions).

您可以使用 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]

另请参阅: