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