Closed
Description
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)
}