1
1
package com.fasterxml.jackson.module.kotlin.test
2
2
3
+ import com.fasterxml.jackson.annotation.JsonCreator
4
+ import com.fasterxml.jackson.annotation.JsonSubTypes
3
5
import com.fasterxml.jackson.annotation.JsonTypeInfo
6
+ import com.fasterxml.jackson.annotation.JsonValue
4
7
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
5
8
import com.fasterxml.jackson.module.kotlin.test.SealedClassTest.SuperClass.B
6
9
import org.junit.Test
10
+ import kotlin.test.assertEquals
7
11
import kotlin.test.assertTrue
8
12
9
13
class SealedClassTest {
@@ -23,9 +27,33 @@ class SealedClassTest {
23
27
assertTrue { result is B }
24
28
}
25
29
30
+ /* *
31
+ * Tests that we can use JsonTypeInfo.Id.DEDUCTION to deduct sealed types without the need for explicit fields.
32
+ */
33
+ @Test
34
+ fun sealedClassWithoutTypeDiscriminator () {
35
+ val serializedSingle = """ {"request":"single"}"""
36
+ val single = mapper.readValue(serializedSingle, SealedRequest ::class .java)
37
+ assertTrue(single is SealedRequest .SingleRequest )
38
+ assertEquals(" single" , single.request)
39
+
40
+ val serializedBatch = """ [{"request":"first"},{"request":"second"}]"""
41
+ val batch = mapper.readValue(serializedBatch, SealedRequest ::class .java)
42
+ assertTrue(batch is SealedRequest .BatchRequest )
43
+ assertEquals(2 , batch.requests.size)
44
+ assertEquals(" first" , batch.requests[0 ].request)
45
+ assertEquals(" second" , batch.requests[1 ].request)
46
+ }
47
+
26
48
@JsonTypeInfo(use = JsonTypeInfo .Id .NAME )
27
49
sealed class SuperClass {
28
50
class A : SuperClass ()
29
51
class B : SuperClass ()
30
52
}
53
+
54
+ @JsonTypeInfo(use = JsonTypeInfo .Id .DEDUCTION )
55
+ sealed class SealedRequest {
56
+ data class SingleRequest (val request : String ) : SealedRequest()
57
+ data class BatchRequest @JsonCreator constructor(@get:JsonValue val requests : List <SingleRequest >): SealedRequest()
58
+ }
31
59
}
0 commit comments