1
1
package com.fasterxml.jackson.module.kotlin.test.github
2
2
3
3
import com.fasterxml.jackson.core.JsonGenerator
4
+ import com.fasterxml.jackson.databind.JsonSerializer
4
5
import com.fasterxml.jackson.databind.ObjectMapper
5
6
import com.fasterxml.jackson.databind.ObjectWriter
6
7
import com.fasterxml.jackson.databind.SerializerProvider
@@ -10,18 +11,20 @@ import com.fasterxml.jackson.databind.ser.std.StdSerializer
10
11
import com.fasterxml.jackson.module.kotlin.KotlinModule
11
12
import com.fasterxml.jackson.module.kotlin.jacksonMapperBuilder
12
13
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
13
- import com.fasterxml.jackson.module.kotlin.test.expectFailure
14
- import org.junit.ComparisonFailure
15
14
import org.junit.Ignore
16
15
import org.junit.Test
17
16
import kotlin.test.assertEquals
18
17
19
18
class Github464 {
20
19
class UnboxTest {
21
- private val writer: ObjectWriter = jacksonObjectMapper().writerWithDefaultPrettyPrinter()
20
+ object NullValueClassKeySerializer : StdSerializer<ValueClass>(ValueClass : :class.java) {
21
+ override fun serialize (value : ValueClass ? , gen : JsonGenerator , provider : SerializerProvider ) {
22
+ gen.writeFieldName(" null-key" )
23
+ }
24
+ }
22
25
23
26
@JvmInline
24
- value class ValueClass (val value : Int )
27
+ value class ValueClass (val value : Int? )
25
28
data class WrapperClass (val inlineField : ValueClass )
26
29
27
30
class Poko (
@@ -33,90 +36,90 @@ class Github464 {
33
36
val quux : Array <ValueClass ?>,
34
37
val corge : WrapperClass ,
35
38
val grault : WrapperClass ? ,
36
- val garply : Map <ValueClass , ValueClass ?>,
37
- val waldo : Map <WrapperClass , WrapperClass ?>
39
+ val garply : Map <ValueClass , ValueClass ?>
38
40
)
39
41
40
- // TODO: Remove this function after applying unbox to key of Map and cancel Ignore of test.
41
- @Test
42
- fun tempTest () {
43
- val zeroValue = ValueClass (0 )
44
-
45
- val target = Poko (
46
- foo = zeroValue,
47
- bar = null ,
48
- baz = zeroValue,
49
- qux = listOf (zeroValue, null ),
50
- quux = arrayOf(zeroValue, null ),
51
- corge = WrapperClass (zeroValue),
52
- grault = null ,
53
- garply = emptyMap(),
54
- waldo = emptyMap()
55
- )
42
+ private val zeroValue = ValueClass (0 )
43
+ private val oneValue = ValueClass (1 )
44
+ private val nullValue = ValueClass (null )
45
+
46
+ private val target = Poko (
47
+ foo = zeroValue,
48
+ bar = null ,
49
+ baz = zeroValue,
50
+ qux = listOf (zeroValue, null ),
51
+ quux = arrayOf(zeroValue, null ),
52
+ corge = WrapperClass (zeroValue),
53
+ grault = null ,
54
+ garply = mapOf (zeroValue to zeroValue, oneValue to null , nullValue to nullValue)
55
+ )
56
56
57
- assertEquals("""
58
- {
59
- "foo" : 0,
60
- "bar" : null,
61
- "baz" : 0,
62
- "qux" : [ 0, null ],
63
- "quux" : [ 0, null ],
64
- "corge" : {
65
- "inlineField" : 0
66
- },
67
- "grault" : null,
68
- "garply" : { },
69
- "waldo" : { }
70
- }
71
- """ .trimIndent(),
57
+ @Test
58
+ fun test () {
59
+ @Suppress(" UNCHECKED_CAST" )
60
+ val writer: ObjectWriter = jacksonObjectMapper()
61
+ .apply { serializerProvider.setNullKeySerializer(NullValueClassKeySerializer as JsonSerializer <Any ?>) }
62
+ .writerWithDefaultPrettyPrinter()
63
+
64
+ assertEquals(
65
+ """
66
+ {
67
+ "foo" : 0,
68
+ "bar" : null,
69
+ "baz" : 0,
70
+ "qux" : [ 0, null ],
71
+ "quux" : [ 0, null ],
72
+ "corge" : {
73
+ "inlineField" : 0
74
+ },
75
+ "grault" : null,
76
+ "garply" : {
77
+ "0" : 0,
78
+ "1" : null,
79
+ "null-key" : null
80
+ }
81
+ }
82
+ """ .trimIndent(),
72
83
writer.writeValueAsString(target)
73
84
)
74
85
}
75
86
87
+ object NullValueSerializer : StdSerializer<Any>(Any : :class.java) {
88
+ override fun serialize (value : Any? , gen : JsonGenerator , provider : SerializerProvider ) {
89
+ gen.writeString(" null-value" )
90
+ }
91
+ }
92
+
76
93
@Test
77
- fun test () {
78
- val zeroValue = ValueClass (0 )
79
- val oneValue = ValueClass (1 )
80
-
81
- val target = Poko (
82
- foo = zeroValue,
83
- bar = null ,
84
- baz = zeroValue,
85
- qux = listOf (zeroValue, null ),
86
- quux = arrayOf(zeroValue, null ),
87
- corge = WrapperClass (zeroValue),
88
- grault = null ,
89
- garply = mapOf (zeroValue to zeroValue, oneValue to null ),
90
- waldo = mapOf (WrapperClass (zeroValue) to WrapperClass (zeroValue), WrapperClass (oneValue) to null )
94
+ fun nullValueSerializerTest () {
95
+ @Suppress(" UNCHECKED_CAST" )
96
+ val writer = jacksonObjectMapper()
97
+ .apply {
98
+ serializerProvider.setNullKeySerializer(NullValueClassKeySerializer as JsonSerializer <Any ?>)
99
+ serializerProvider.setNullValueSerializer(NullValueSerializer )
100
+ }.writerWithDefaultPrettyPrinter()
101
+
102
+ assertEquals(
103
+ """
104
+ {
105
+ "foo" : 0,
106
+ "bar" : "null-value",
107
+ "baz" : 0,
108
+ "qux" : [ 0, "null-value" ],
109
+ "quux" : [ 0, "null-value" ],
110
+ "corge" : {
111
+ "inlineField" : 0
112
+ },
113
+ "grault" : "null-value",
114
+ "garply" : {
115
+ "0" : 0,
116
+ "1" : "null-value",
117
+ "null-key" : "null-value"
118
+ }
119
+ }
120
+ """ .trimIndent(),
121
+ writer.writeValueAsString(target)
91
122
)
92
-
93
- expectFailure<ComparisonFailure >(" GitHub #469 has been fixed!" ) {
94
- assertEquals("""
95
- {
96
- "foo" : 0,
97
- "bar" : null,
98
- "baz" : 0,
99
- "qux" : [ 0, null ],
100
- "quux" : [ 0, null ],
101
- "corge" : {
102
- "inlineField" : 0
103
- },
104
- "grault" : null,
105
- "garply" : {
106
- "0" : 0,
107
- "1" : null
108
- },
109
- "waldo" : {
110
- "{inlineField=0}" : {
111
- "inlineField" : 0
112
- },
113
- "{inlineField=1}" : null
114
- }
115
- }
116
- """ .trimIndent(),
117
- writer.writeValueAsString(target)
118
- )
119
- }
120
123
}
121
124
}
122
125
@@ -129,15 +132,22 @@ class Github464 {
129
132
gen.writeString(value.value.toString())
130
133
}
131
134
}
135
+ object KeySerializer : StdSerializer<ValueBySerializer>(ValueBySerializer : :class.java) {
136
+ override fun serialize (value : ValueBySerializer , gen : JsonGenerator , provider : SerializerProvider ) {
137
+ gen.writeFieldName(value.value.toString())
138
+ }
139
+ }
132
140
133
- private val target = listOf (ValueBySerializer (1 ))
141
+ private val target = mapOf (ValueBySerializer (1 ) to ValueBySerializer (2 ))
142
+ private val sm = SimpleModule ()
143
+ .addSerializer(Serializer )
144
+ .addKeySerializer(ValueBySerializer ::class .java, KeySerializer )
134
145
135
146
@Test
136
147
fun simpleTest () {
137
- val sm = SimpleModule ().addSerializer(Serializer )
138
148
val om: ObjectMapper = jacksonMapperBuilder().addModule(sm).build()
139
149
140
- assertEquals(""" [ "1"] """ , om.writeValueAsString(target))
150
+ assertEquals(""" { "1":"2"} """ , om.writeValueAsString(target))
141
151
}
142
152
143
153
// Currently, there is a situation where the serialization results are different depending on the registration order of the modules.
@@ -146,13 +156,12 @@ class Github464 {
146
156
@Ignore
147
157
@Test
148
158
fun priorityTest () {
149
- val sm = SimpleModule ().addSerializer(Serializer )
150
159
val km = KotlinModule .Builder ().build()
151
160
val om1: ObjectMapper = JsonMapper .builder().addModules(km, sm).build()
152
161
val om2: ObjectMapper = JsonMapper .builder().addModules(sm, km).build()
153
162
154
- // om1(collect) -> """[ "1"] """
155
- // om2(broken) -> """[1] """
163
+ // om1(collect) -> """{ "1":"2"} """
164
+ // om2(broken) -> """{"1":2} """
156
165
assertEquals(om1.writeValueAsString(target), om2.writeValueAsString(target))
157
166
}
158
167
}
0 commit comments