Skip to content

Commit 2fe15db

Browse files
authored
Merge pull request #322 from Neuman968/addSerializerExtensions
Added addSerializer and addDeserializer extensions to SimpleModule for registering KClasses
2 parents 8a78254 + 5c5e3b0 commit 2fe15db

File tree

4 files changed

+90
-1
lines changed

4 files changed

+90
-1
lines changed

release-notes/CREDITS-2.x

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,7 @@ Drew Stephens (dinomite@github)
5050

5151
Mateusz Stefek (MateuszStefek@github)
5252
* Reported #321: Make MissingKotlinParameterException a descendant of MismatchedInputException
53+
54+
John Flynn (Neuman968@github)
55+
* Contributed extension methods for SimpleModule to add serializer and deserializer extension functions for KClass #322
56+
(2.12.x)

release-notes/VERSION-2.x

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ Project: jackson-module-kotlin
44
=== Releases ===
55
------------------------------------------------------------------------
66

7+
2.12.0 (not yet released)
8+
9+
#322 Added extension methods to SimpleModule addSerializer and addDeserializer to support KClass arguments that
10+
register the serializer/deserializer for both the java type and java class.
11+
-
12+
713
2.11.1 (not yet released)
814

915
-

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,14 @@ import com.fasterxml.jackson.databind.JsonMappingException
77
import com.fasterxml.jackson.databind.MappingIterator
88
import com.fasterxml.jackson.databind.ObjectMapper
99
import com.fasterxml.jackson.databind.ObjectReader
10+
import com.fasterxml.jackson.databind.module.SimpleModule
11+
import com.fasterxml.jackson.databind.JsonDeserializer
12+
import com.fasterxml.jackson.databind.JsonSerializer
1013
import java.io.File
1114
import java.io.InputStream
1215
import java.io.Reader
1316
import java.net.URL
17+
import kotlin.reflect.KClass
1418

1519
fun jacksonObjectMapper(): ObjectMapper = ObjectMapper().registerKotlinModule()
1620
fun ObjectMapper.registerKotlinModule(): ObjectMapper = this.registerModule(KotlinModule())
@@ -35,4 +39,14 @@ inline fun <reified T> ObjectReader.readValuesTyped(jp: JsonParser): Iterator<T>
3539
inline fun <reified T> ObjectReader.treeToValue(n: TreeNode): T? = treeToValue(n, T::class.java)
3640

3741
internal fun JsonMappingException.wrapWithPath(refFrom: Any?, refFieldName: String) = JsonMappingException.wrapWithPath(this, refFrom, refFieldName)
38-
internal fun JsonMappingException.wrapWithPath(refFrom: Any?, index: Int) = JsonMappingException.wrapWithPath(this, refFrom, index)
42+
internal fun JsonMappingException.wrapWithPath(refFrom: Any?, index: Int) = JsonMappingException.wrapWithPath(this, refFrom, index)
43+
44+
inline fun <reified T : Any> SimpleModule.addSerializer(kClass: KClass<T>, serializer: JsonSerializer<T>) = this.apply {
45+
addSerializer(kClass.java, serializer)
46+
addSerializer(kClass.javaObjectType, serializer)
47+
}
48+
49+
inline fun <reified T : Any> SimpleModule.addDeserializer(kClass: KClass<T>, deserializer: JsonDeserializer<T>) = this.apply {
50+
addDeserializer(kClass.java, deserializer)
51+
addDeserializer(kClass.javaObjectType, deserializer)
52+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.fasterxml.jackson.module.kotlin.test
2+
3+
import com.fasterxml.jackson.core.JsonGenerator
4+
import com.fasterxml.jackson.core.JsonParser
5+
import com.fasterxml.jackson.databind.*
6+
import com.fasterxml.jackson.databind.module.SimpleModule
7+
import com.fasterxml.jackson.module.kotlin.addDeserializer
8+
import com.fasterxml.jackson.module.kotlin.addSerializer
9+
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
10+
import com.fasterxml.jackson.module.kotlin.readValue
11+
import org.hamcrest.CoreMatchers.equalTo
12+
import org.hamcrest.MatcherAssert.assertThat
13+
import org.junit.Test
14+
import java.math.BigDecimal
15+
import java.math.RoundingMode
16+
17+
class KClassSerializerDeserializerTest {
18+
19+
val objectMapper = jacksonObjectMapper()
20+
.registerModule(SimpleModule()
21+
.addSerializer(Double::class, RoundingSerializer())
22+
.addDeserializer(Double::class, RoundingDeserializer()))
23+
24+
25+
@Test
26+
fun `test custom serializer expecting object serialized with rounding serializer applied`() {
27+
val jsonString = objectMapper.writeValueAsString(TestDoubleData(nonNullVal = 1.5567, nullVal = 1.5678))
28+
val testResult = objectMapper.readValue(jsonString, TestDoubleData::class.java)
29+
assertThat(testResult.nonNullVal, equalTo(1.56))
30+
assertThat(testResult.nullVal, equalTo(1.57))
31+
}
32+
33+
@Test
34+
fun `test custom deserializer expecting object deserialized with rounding deserializer applied`() {
35+
val testResult = objectMapper.readValue<TestDoubleData>("""
36+
{
37+
"nonNullVal":1.5567,
38+
"nullVal":1.5678
39+
}
40+
""".trimIndent())
41+
assertThat(testResult.nonNullVal, equalTo(1.56))
42+
assertThat(testResult.nullVal, equalTo(1.57))
43+
}
44+
}
45+
46+
data class TestDoubleData(
47+
val nonNullVal: Double,
48+
val nullVal: Double?
49+
)
50+
51+
class RoundingSerializer : JsonSerializer<Double>() {
52+
override fun serialize(value: Double?, gen: JsonGenerator?, serializers: SerializerProvider?) {
53+
value?.let {
54+
gen?.writeNumber(BigDecimal(it).setScale(2, RoundingMode.HALF_UP))
55+
}
56+
}
57+
}
58+
59+
class RoundingDeserializer : JsonDeserializer<Double>() {
60+
override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): Double? {
61+
return BigDecimal(p?.valueAsString)
62+
.setScale(2, RoundingMode.HALF_UP)
63+
.toDouble()
64+
}
65+
}

0 commit comments

Comments
 (0)