1

I am trying to serialize a map into CBOR in Kotlin with the Jackson CBOR Dataformats Library, this works fine if the key is a String , I can retrieve the value of that key easily but when the key in an Int, it returns null to me for every get I do, If I print out the output from values(), it gives me all values from all keys.

Code looks like this :

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

1 Answers1

0

Try to iterate over keys and check the type:

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

Above code, in your case should print:

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

And:

println(deserialized.get("123"))

prints:

[22, 67, 2]

Take a look on 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).

You can force type using Kotlin's readValue method:

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

and use it like this:

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

Above code prints:

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

See also:

Michał Ziober
  • 37,175
  • 18
  • 99
  • 146