Skip to content

Array iterator is serialized as a bean #604

Closed
@thecam

Description

@thecam

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions