jackson-module-kotlin
jackson-module-kotlin copied to clipboard
Array iterator is serialized as a bean
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)
}