Skip to content

Commit ff22623

Browse files
authored
[KTLN-871] Add Samples (#967)
* [KTLN-871] Add Samples * [KTLN-871] Downgrade serialization compiler version * [KTLN-871] Explicitly define kotlin version * [KTLN-871] Tweak versions * [KTLN-871] Tweak versions * [KTLN-871] Tweak versions * [KTLN-871] Tweak versions
1 parent 7e110ae commit ff22623

File tree

6 files changed

+179
-0
lines changed

6 files changed

+179
-0
lines changed

kotlin-libraries-data/pom.xml

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,29 @@
3232
<artifactId>mapstruct</artifactId>
3333
<version>${mapstruct.version}</version>
3434
</dependency>
35+
<dependency>
36+
<groupId>com.google.code.gson</groupId>
37+
<artifactId>gson</artifactId>
38+
<version>${gson.version}</version>
39+
<scope>compile</scope>
40+
</dependency>
41+
<dependency>
42+
<groupId>com.fasterxml.jackson.core</groupId>
43+
<artifactId>jackson-annotations</artifactId>
44+
<version>${jackson-kotlin.version}</version>
45+
<scope>compile</scope>
46+
</dependency>
47+
<dependency>
48+
<groupId>org.jetbrains.kotlinx</groupId>
49+
<artifactId>kotlinx-serialization-core-jvm</artifactId>
50+
<version>${kotlinx-serialization-json-jvm.version}</version>
51+
<scope>compile</scope>
52+
</dependency>
53+
<dependency>
54+
<groupId>com.fasterxml.jackson.module</groupId>
55+
<artifactId>jackson-module-kotlin</artifactId>
56+
<version>${jackson-kotlin.version}</version>
57+
</dependency>
3558
</dependencies>
3659

3760
<build>
@@ -70,13 +93,40 @@
7093
</execution>
7194
</executions>
7295
</plugin>
96+
<plugin>
97+
<groupId>org.jetbrains.kotlin</groupId>
98+
<artifactId>kotlin-maven-plugin</artifactId>
99+
<version>${kotlin.version}</version>
100+
<executions>
101+
<execution>
102+
<id>compile</id>
103+
<phase>compile</phase>
104+
<goals>
105+
<goal>compile</goal>
106+
</goals>
107+
</execution>
108+
</executions>
109+
<configuration>
110+
<compilerPlugins>
111+
<plugin>kotlinx-serialization</plugin>
112+
</compilerPlugins>
113+
</configuration>
114+
<dependencies>
115+
<dependency>
116+
<groupId>org.jetbrains.kotlin</groupId>
117+
<artifactId>kotlin-maven-serialization</artifactId>
118+
<version>${kotlin.version}</version>
119+
</dependency>
120+
</dependencies>
121+
</plugin>
73122
</plugins>
74123
</build>
75124

76125
<properties>
77126
<kotlinx-serialization-json-jvm.version>1.6.0</kotlinx-serialization-json-jvm.version>
78127
<kotlinx-datetime-jvm.version>0.4.0</kotlinx-datetime-jvm.version>
79128
<mapstruct.version>1.5.3.Final</mapstruct.version>
129+
<jackson-kotlin.version>2.9.8</jackson-kotlin.version>
80130
</properties>
81131

82132
</project>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.baeldung.serialization
2+
3+
import com.baeldung.serialization.jackson.StatusSerializer
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class ApiResponse(
8+
@Serializable(with = StatusSerializer::class)
9+
val status: Status
10+
)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.baeldung.serialization
2+
3+
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue
4+
5+
enum class Status {
6+
SUCCESS,
7+
ERROR,
8+
@JsonEnumDefaultValue // Jackson-specific annotation
9+
UNKNOWN
10+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.baeldung.serialization.gson
2+
3+
import com.baeldung.serialization.Status
4+
import com.google.gson.JsonDeserializationContext
5+
import com.google.gson.JsonDeserializer
6+
import com.google.gson.JsonElement
7+
import java.lang.reflect.Type
8+
9+
class StatusDeserializer : JsonDeserializer<Status> {
10+
override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Status {
11+
return try {
12+
Status.valueOf(json.asString.uppercase())
13+
} catch (e: IllegalArgumentException) {
14+
Status.UNKNOWN
15+
}
16+
}
17+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.baeldung.serialization.jackson
2+
3+
import com.baeldung.serialization.Status
4+
import kotlinx.serialization.KSerializer
5+
import kotlinx.serialization.descriptors.PrimitiveKind
6+
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
7+
import kotlinx.serialization.descriptors.SerialDescriptor
8+
import kotlinx.serialization.encoding.Decoder
9+
import kotlinx.serialization.encoding.Encoder
10+
11+
object StatusSerializer : KSerializer<Status> {
12+
override val descriptor: SerialDescriptor =
13+
PrimitiveSerialDescriptor("Status", PrimitiveKind.STRING)
14+
15+
override fun serialize(
16+
encoder: Encoder,
17+
value: Status
18+
) {
19+
encoder.encodeString(value.name)
20+
}
21+
22+
override fun deserialize(decoder: Decoder): Status {
23+
return try {
24+
Status.valueOf(decoder.decodeString().uppercase())
25+
} catch (e: IllegalArgumentException) {
26+
Status.UNKNOWN
27+
}
28+
}
29+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.baeldung.serialization
2+
3+
import com.baeldung.serialization.gson.StatusDeserializer
4+
import com.fasterxml.jackson.databind.DeserializationFeature
5+
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
6+
import com.fasterxml.jackson.module.kotlin.readValue
7+
import com.google.gson.GsonBuilder
8+
import kotlinx.serialization.json.Json
9+
import org.junit.jupiter.api.Assertions.assertEquals
10+
import org.junit.jupiter.api.Test
11+
12+
class UnknownEnumSerializationUnitTest {
13+
14+
val gson = GsonBuilder()
15+
.registerTypeAdapter(Status::class.java, StatusDeserializer())
16+
.create()
17+
18+
val mapper = jacksonObjectMapper().apply {
19+
configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE, true)
20+
}
21+
22+
@Test
23+
fun `test known status value deserialization gson`() {
24+
val json = """{"status": "SUCCESS"}"""
25+
val response = gson.fromJson(json, ApiResponse::class.java)
26+
assertEquals(Status.SUCCESS, response.status)
27+
}
28+
29+
@Test
30+
fun `test unknown status value deserialization gson`() {
31+
val unknownJson = """{"status": "unknown_value"}"""
32+
val response = gson.fromJson(unknownJson, ApiResponse::class.java)
33+
assertEquals(Status.UNKNOWN, response.status)
34+
}
35+
36+
@Test
37+
fun `test known status value deserialization jackson`() {
38+
val json = """{"status": "SUCCESS"}"""
39+
val response = mapper.readValue<ApiResponse>(json)
40+
assertEquals(Status.SUCCESS, response.status)
41+
}
42+
43+
@Test
44+
fun `test unknown status value deserialization jackson`() {
45+
val unknownJson = """{"status": "unknown_value"}"""
46+
val response = mapper.readValue<ApiResponse>(unknownJson)
47+
assertEquals(Status.UNKNOWN, response.status)
48+
}
49+
50+
@Test
51+
fun `test known status value deserialization kotlinx-serialization`() {
52+
val json = """{"status": "success"}"""
53+
val response = Json.decodeFromString<ApiResponse>(json)
54+
assertEquals(Status.SUCCESS, response.status)
55+
}
56+
57+
@Test
58+
fun `test unknown status value deserialization kotlinx-serialization`() {
59+
val unknownJson = """{"status": "unknown_value"}"""
60+
val unknownResponse = Json.decodeFromString<ApiResponse>(unknownJson)
61+
assertEquals(Status.UNKNOWN, unknownResponse.status)
62+
}
63+
}

0 commit comments

Comments
 (0)