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