kotlinserializationjacksoncbor

Retrieving data from CBOR ByteArray


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

Solution

  • 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: