Skip to content

Commit cab221c

Browse files
author
apatrida
committed
merging PR #261 for serdes Kotlin Sequences
1 parent 21c74d0 commit cab221c

File tree

9 files changed

+104
-119
lines changed

9 files changed

+104
-119
lines changed

src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinBeanDeserializerModifier.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ import com.fasterxml.jackson.databind.JsonDeserializer
66
import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier
77

88
// [module-kotlin#225]: keep Kotlin singletons as singletons
9-
object KotlinBeanDeserializerModifier: BeanDeserializerModifier() {
9+
object KotlinBeanDeserializerModifier : BeanDeserializerModifier() {
1010
override fun modifyDeserializer(
1111
config: DeserializationConfig,
1212
beanDesc: BeanDescription,
1313
deserializer: JsonDeserializer<*>
1414
): JsonDeserializer<out Any> {
1515
val modifiedFromParent = super.modifyDeserializer(config, beanDesc, deserializer)
16-
val objectSingletonInstance = objectSingletonInstance(beanDesc.beanClass)
16+
17+
val objectSingletonInstance = objectSingletonInstance(beanDesc.beanClass)
1718
return if (objectSingletonInstance != null) {
1819
KotlinObjectSingletonDeserializer(objectSingletonInstance, modifiedFromParent)
1920
} else {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.fasterxml.jackson.module.kotlin
2+
3+
import com.fasterxml.jackson.core.JsonParser
4+
import com.fasterxml.jackson.databind.*
5+
import com.fasterxml.jackson.databind.deser.Deserializers
6+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer
7+
8+
object SequenceDeserializer : StdDeserializer<Sequence<*>>(Sequence::class.java) {
9+
override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Sequence<*> {
10+
return ctxt.readValue(p, List::class.java).asSequence()
11+
}
12+
}
13+
14+
internal class KotlinDeserializers: Deserializers.Base() {
15+
override fun findBeanDeserializer(type: JavaType, config: DeserializationConfig?, beanDesc: BeanDescription?): JsonDeserializer<*>? {
16+
return if (type.isInterface && type.rawClass == Sequence::class.java) {
17+
SequenceDeserializer
18+
} else {
19+
null
20+
}
21+
}
22+
}

src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinModule.kt

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,18 @@ package com.fasterxml.jackson.module.kotlin
33
import com.fasterxml.jackson.annotation.JsonCreator
44
import com.fasterxml.jackson.annotation.JsonProperty
55
import com.fasterxml.jackson.databind.MapperFeature
6-
import com.fasterxml.jackson.databind.introspect.Annotated
7-
import com.fasterxml.jackson.databind.introspect.AnnotatedConstructor
8-
import com.fasterxml.jackson.databind.introspect.AnnotatedMember
9-
import com.fasterxml.jackson.databind.introspect.AnnotatedParameter
10-
import com.fasterxml.jackson.databind.introspect.NopAnnotationIntrospector
6+
import com.fasterxml.jackson.databind.introspect.*
117
import com.fasterxml.jackson.databind.module.SimpleModule
128
import com.fasterxml.jackson.databind.util.LRUMap
139
import java.lang.reflect.Constructor
1410
import java.lang.reflect.Method
15-
import java.lang.reflect.Modifier
1611
import kotlin.reflect.KClass
1712
import kotlin.reflect.KFunction
1813
import kotlin.reflect.KParameter
19-
import kotlin.reflect.full.*
14+
import kotlin.reflect.full.companionObject
15+
import kotlin.reflect.full.declaredFunctions
16+
import kotlin.reflect.full.memberProperties
17+
import kotlin.reflect.full.primaryConstructor
2018
import kotlin.reflect.jvm.internal.KotlinReflectionInternalError
2119
import kotlin.reflect.jvm.javaType
2220
import kotlin.reflect.jvm.kotlinFunction
@@ -46,13 +44,16 @@ class KotlinModule(val reflectionCacheSize: Int = 512, val nullToEmptyCollection
4644
// [module-kotlin#225]: keep Kotlin singletons as singletons
4745
context.addBeanDeserializerModifier(KotlinBeanDeserializerModifier)
4846

47+
context.insertAnnotationIntrospector(KotlinAnnotationIntrospector(context, cache, nullToEmptyCollection, nullToEmptyMap))
48+
context.appendAnnotationIntrospector(KotlinNamesAnnotationIntrospector(this, cache))
49+
50+
context.addDeserializers(KotlinDeserializers())
51+
context.addSerializers(KotlinSerializers())
52+
4953
fun addMixIn(clazz: Class<*>, mixin: Class<*>) {
5054
context.setMixInAnnotations(clazz, mixin)
5155
}
5256

53-
context.insertAnnotationIntrospector(KotlinAnnotationIntrospector(context, cache, nullToEmptyCollection, nullToEmptyMap))
54-
context.appendAnnotationIntrospector(KotlinNamesAnnotationIntrospector(this, cache))
55-
5657
// ranges
5758
addMixIn(IntRange::class.java, ClosedRangeMixin::class.java)
5859
addMixIn(CharRange::class.java, ClosedRangeMixin::class.java)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.fasterxml.jackson.module.kotlin
2+
3+
import com.fasterxml.jackson.core.JsonGenerator
4+
import com.fasterxml.jackson.databind.*
5+
import com.fasterxml.jackson.databind.ser.Serializers
6+
import com.fasterxml.jackson.databind.ser.std.StdSerializer
7+
8+
object SequenceSerializer : StdSerializer<Sequence<*>>(Sequence::class.java) {
9+
override fun serialize(value: Sequence<*>, gen: JsonGenerator, provider: SerializerProvider) {
10+
val materializedList = value.toList()
11+
provider.defaultSerializeValue(materializedList, gen)
12+
}
13+
}
14+
15+
internal class KotlinSerializers : Serializers.Base() {
16+
override fun findSerializer(config: SerializationConfig?, type: JavaType, beanDesc: BeanDescription?): JsonSerializer<*>? {
17+
return if (Sequence::class.java.isAssignableFrom(type.rawClass)) {
18+
SequenceSerializer
19+
} else {
20+
null
21+
}
22+
}
23+
}

src/main/kotlin/com/fasterxml/jackson/module/kotlin/deserializers/SequenceDeserializer.kt

Lines changed: 0 additions & 14 deletions
This file was deleted.

src/main/kotlin/com/fasterxml/jackson/module/kotlin/serializers/SequenceSerializer.kt

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.fasterxml.jackson.module.kotlin.test
2+
3+
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
4+
import com.fasterxml.jackson.module.kotlin.readValue
5+
import org.junit.Test
6+
import kotlin.test.assertEquals
7+
8+
9+
class SequenceDeserializerTest {
10+
data class Data(val value: Sequence<String>)
11+
12+
@Test
13+
fun deserializeSequence() {
14+
val list = listOf("Test", "Test1")
15+
val objectMapper = jacksonObjectMapper()
16+
val result = objectMapper.readValue<Data>("{\"value\":[\"Test\",\"Test1\"]}")
17+
assertEquals(list, result.value.toList())
18+
}
19+
20+
@Test
21+
fun deserializeEmptySequence() {
22+
val list = listOf<String>()
23+
val objectMapper = jacksonObjectMapper()
24+
val result = objectMapper.readValue<Data>("{\"value\":[]}")
25+
assertEquals(list, result.value.toList())
26+
}
27+
28+
@Test
29+
fun testSerializeSequence() {
30+
val sequence = listOf("item1", "item2").asSequence()
31+
val data = Data(sequence)
32+
val objectMapper = jacksonObjectMapper()
33+
val result = objectMapper.writeValueAsString(data)
34+
assertEquals("{\"value\":[\"item1\",\"item2\"]}", result)
35+
}
36+
37+
@Test
38+
fun testSerializeEmptySequence() {
39+
val sequence = listOf<String>().asSequence()
40+
val data = Data(sequence)
41+
val objectMapper = jacksonObjectMapper()
42+
val result = objectMapper.writeValueAsString(data)
43+
assertEquals("{\"value\":[]}", result)
44+
}
45+
}

src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/deserializers/SequenceDeserializerTest.kt

Lines changed: 0 additions & 37 deletions
This file was deleted.

src/test/kotlin/com/fasterxml/jackson/module/kotlin/test/serializers/SequenceSerializerTest.kt

Lines changed: 0 additions & 42 deletions
This file was deleted.

0 commit comments

Comments
 (0)