-
-
Notifications
You must be signed in to change notification settings - Fork 181
Closed
Labels
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)
}