diff --git a/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinSerializers.kt b/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinSerializers.kt index b3a829eb3..d174ff708 100644 --- a/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinSerializers.kt +++ b/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinSerializers.kt @@ -8,8 +8,14 @@ import com.fasterxml.jackson.databind.ser.std.StdSerializer object SequenceSerializer : StdSerializer>(Sequence::class.java) { override fun serialize(value: Sequence<*>, gen: JsonGenerator, provider: SerializerProvider) { - val materializedList = value.toList() - provider.writeValue(gen, materializedList) + provider.findTypedValueSerializer( + Iterable::class.java, + true + ).serialize( + value.asIterable(), + gen, + provider + ) } } diff --git a/src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/SequenceSerdesTests.kt b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/SequenceSerdesTests.kt index 20e49aade..6425e9747 100644 --- a/src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/SequenceSerdesTests.kt +++ b/src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/SequenceSerdesTests.kt @@ -7,13 +7,13 @@ import kotlin.test.assertEquals class TestSequenceDeserializer { - data class Data(val value: Sequence) + data class Data(val value: Sequence) @Test fun deserializeSequence() { val list = listOf("Test", "Test1") val objectMapper = jacksonObjectMapper() - val result = objectMapper.readValue("{\"value\":[\"Test\",\"Test1\"]}") + val result = objectMapper.readValue>("{\"value\":[\"Test\",\"Test1\"]}") assertEquals(list, result.value.toList()) } @@ -21,7 +21,7 @@ class TestSequenceDeserializer { fun deserializeEmptySequence() { val list = listOf() val objectMapper = jacksonObjectMapper() - val result = objectMapper.readValue("{\"value\":[]}") + val result = objectMapper.readValue>("{\"value\":[]}") assertEquals(list, result.value.toList()) } @@ -42,4 +42,36 @@ class TestSequenceDeserializer { val result = objectMapper.writeValueAsString(data) assertEquals("{\"value\":[]}", result) } + + @Test + fun testSerializeLazySequence() { + val sequence = sequence> { + (0..2).forEach { i -> + yieldAll((0..2).map { j -> + mapOf("key[$i][$j]" to "value[$i][$j]") + }) + } + } + val data = Data(sequence) + val objectMapper = jacksonObjectMapper() + val result = objectMapper.writeValueAsString(data) + assertEquals( + """ + { + "value":[ + {"key[0][0]": "value[0][0]"}, + {"key[0][1]": "value[0][1]"}, + {"key[0][2]": "value[0][2]"}, + {"key[1][0]": "value[1][0]"}, + {"key[1][1]": "value[1][1]"}, + {"key[1][2]": "value[1][2]"}, + {"key[2][0]": "value[2][0]"}, + {"key[2][1]": "value[2][1]"}, + {"key[2][2]": "value[2][2]"} + ] + } + """.replace("\\s".toRegex(), ""), + result + ) + } } \ No newline at end of file