jackson-module-kotlin icon indicating copy to clipboard operation
jackson-module-kotlin copied to clipboard

Array iterator is serialized as a bean

Open thecam opened this issue 3 years ago • 0 comments

Describe the bug Kotlin array iterators are serialized as beans, unlike Java iterators which as serialized as arrays, using the IteratorSerializer.

To Reproduce main.kt

import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper

val kotlinArray = arrayOf(1, 2, 3)

fun main() {
    val mapper = jacksonObjectMapper()

    println("kotlin array: ${mapper.writeValueAsString(kotlinArray)}")
    println("kotlin array iterator: ${mapper.writeValueAsString(kotlinArray.iterator())}")
    println()
    println("java array: ${mapper.writeValueAsString(Java.array)}")
    println("java array iterator: ${mapper.writeValueAsString(Java.array.iterator())}")
}

Java.java

public class Java {
    public static int[] array = {1, 2, 3};
}

Output:

kotlin array: [1,2,3]
kotlin array iterator: {"array":[1,2,3]}

java array: [1,2,3]
java array iterator: [1,2,3]

Expected behavior I expected the JSON for Kotlin and Java array iterators to be consistent.

Versions Kotlin: Jackson-module-kotlin: 2.14.0 Jackson-databind: 2.14.0

Additional context This problem was found in a project with a mixed Java and Kotlin codebase.

Workaround: Force serializing all iterators as such, using a mixin:

@JsonSerialize(`as` = Iterator::class)
internal interface KotlinIteratorMixin

val mapper = jsonMapper {
        addModule(kotlinModule())
        addMixIn(Iterator::class.java, KotlinIteratorMixin::class.java)
}

thecam avatar Nov 08 '22 19:11 thecam