Skip to content

Commit 0e6386a

Browse files
authored
Merge pull request #956 from sk1418/enum-field-to-json
[enum-field-to-json] enum property in JSON
2 parents 5160e31 + f65ba37 commit 0e6386a

File tree

7 files changed

+238
-0
lines changed

7 files changed

+238
-0
lines changed

kotlin-json-2/.gitignore

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/bin/
2+
3+
#ignore gradle
4+
.gradle/
5+
6+
7+
#ignore build and generated files
8+
build/
9+
node/
10+
out/
11+
12+
#ignore installed node modules and package lock file
13+
node_modules/
14+
package-lock.json

kotlin-json-2/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
## JSON
2+
3+
This module contains modules about JSON.
4+

kotlin-json-2/pom.xml

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<artifactId>kotlin-json-2</artifactId>
6+
<name>kotlin-json-2</name>
7+
<packaging>jar</packaging>
8+
9+
<parent>
10+
<groupId>com.baeldung</groupId>
11+
<artifactId>kotlin-modules</artifactId>
12+
<version>1.0.0-SNAPSHOT</version>
13+
</parent>
14+
15+
<dependencies>
16+
<dependency>
17+
<groupId>com.fasterxml.jackson.module</groupId>
18+
<artifactId>jackson-module-kotlin</artifactId>
19+
<version>${jackson.version}</version>
20+
</dependency>
21+
<dependency>
22+
<groupId>com.google.code.gson</groupId>
23+
<artifactId>gson</artifactId>
24+
<version>${gson.version}</version>
25+
</dependency>
26+
<dependency>
27+
<groupId>org.jetbrains.kotlinx</groupId>
28+
<artifactId>kotlinx-serialization-json</artifactId>
29+
<version>${serialization.version}</version>
30+
</dependency>
31+
<dependency>
32+
<groupId>com.fasterxml.jackson.core</groupId>
33+
<artifactId>jackson-core</artifactId>
34+
<version>${jackson.version}</version>
35+
</dependency>
36+
<dependency>
37+
<groupId>com.fasterxml.jackson.core</groupId>
38+
<artifactId>jackson-annotations</artifactId>
39+
<version>${jackson.version}</version>
40+
</dependency>
41+
<dependency>
42+
<groupId>org.jetbrains.kotlinx</groupId>
43+
<artifactId>kotlinx-serialization-core-jvm</artifactId>
44+
<version>${serialization.version}</version>
45+
</dependency>
46+
</dependencies>
47+
</project>
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.baeldung.kotlin.serializeEnumField
2+
3+
import com.google.gson.*
4+
import com.google.gson.annotations.SerializedName
5+
import org.junit.jupiter.api.Test
6+
import java.lang.reflect.Type
7+
import kotlin.test.assertEquals
8+
9+
10+
class EnumFieldGsonUnitTest {
11+
12+
enum class Language(val description: String) {
13+
@SerializedName("Kotlin_is_awesome")
14+
KOTLIN("Kotlin_is_awesome"),
15+
16+
@SerializedName("Java_is_great")
17+
JAVA("Java_is_great"),
18+
19+
@SerializedName("Go_is_nice")
20+
GO("Go_is_nice")
21+
}
22+
23+
data class Dev(val name: String, val language: Language)
24+
25+
@Test
26+
fun `when serialize enum field with gson @SerializedName, then get expected result`() {
27+
val dev = Dev("Kai", Language.GO)
28+
val json = Gson().toJson(dev)
29+
assertEquals("""{"name":"Kai","language":"Go_is_nice"}""", json)
30+
}
31+
}
32+
33+
class EnumFieldGson2UnitTest {
34+
class LanguageSerializer : JsonSerializer<Language> {
35+
override fun serialize(src: Language?, typeOfSrc: Type?, context: JsonSerializationContext?): JsonElement {
36+
return JsonPrimitive(requireNotNull(src).description)
37+
}
38+
}
39+
40+
enum class Language(val description: String) {
41+
KOTLIN("Kotlin_is_awesome"),
42+
JAVA("Java_is_great"),
43+
GO("Go_is_nice")
44+
}
45+
46+
data class Dev(val name: String, val language: Language)
47+
48+
@Test
49+
fun `when serialize enum field with gson @SerializedName, then get expected result`() {
50+
val gson = GsonBuilder().registerTypeAdapter(Language::class.java, LanguageSerializer()).create()
51+
val dev = Dev("Kai", Language.GO)
52+
val json = gson.toJson(dev)
53+
assertEquals("""{"name":"Kai","language":"Go_is_nice"}""", json)
54+
}
55+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.baeldung.kotlin.serializeEnumField
2+
3+
import com.fasterxml.jackson.annotation.JsonValue
4+
import com.fasterxml.jackson.databind.ObjectMapper
5+
import com.fasterxml.jackson.module.kotlin.KotlinModule
6+
import org.junit.jupiter.api.Test
7+
import kotlin.test.assertEquals
8+
9+
10+
class EnumFieldInJsonIntroUnitTest {
11+
enum class Language(val description: String) {
12+
KOTLIN("Kotlin_is_awesome"),
13+
JAVA("Java_is_great"),
14+
GO("Go_is_nice")
15+
}
16+
17+
data class Dev(val name: String, val language: Language)
18+
19+
@Test
20+
fun `when serialize enum field, then enum name is taken in json`() {
21+
val mapper = ObjectMapper().registerModule(KotlinModule.Builder().build())
22+
val dev = Dev("Kai", Language.KOTLIN)
23+
val json = mapper.writeValueAsString(dev)
24+
assertEquals("""{"name":"Kai","language":"KOTLIN"}""", json)
25+
}
26+
}
27+
28+
class EnumFieldJacksonUnitTest {
29+
enum class Language(@JsonValue val description: String) {
30+
KOTLIN("Kotlin_is_awesome"),
31+
JAVA("Java_is_great"),
32+
GO("Go_is_nice")
33+
}
34+
35+
data class Dev(val name: String, val language: Language)
36+
37+
@Test
38+
fun `when serialize enum field with jackson @JsonValue, then get expected result`() {
39+
val mapper = ObjectMapper().registerModule(KotlinModule.Builder().build())
40+
val dev = Dev("Kai", Language.KOTLIN)
41+
val json = mapper.writeValueAsString(dev)
42+
assertEquals("""{"name":"Kai","language":"Kotlin_is_awesome"}""", json)
43+
}
44+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.baeldung.kotlin.serializeEnumField
2+
3+
import kotlinx.serialization.KSerializer
4+
import kotlinx.serialization.SerialName
5+
import kotlinx.serialization.Serializable
6+
import kotlinx.serialization.descriptors.PrimitiveKind
7+
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
8+
import kotlinx.serialization.descriptors.SerialDescriptor
9+
import kotlinx.serialization.encodeToString
10+
import kotlinx.serialization.encoding.Decoder
11+
import kotlinx.serialization.encoding.Encoder
12+
import kotlinx.serialization.json.Json
13+
import org.junit.jupiter.api.Test
14+
import kotlin.test.assertEquals
15+
16+
17+
class EnumFieldKotlinxUnitTest {
18+
@Serializable
19+
enum class Language(val description: String) {
20+
@SerialName("Kotlin_is_awesome")
21+
KOTLIN("Kotlin_is_awesome"),
22+
23+
@SerialName("Java_is_great")
24+
JAVA("Java_is_great"),
25+
26+
@SerialName("Go_is_nice")
27+
GO("Go_is_nice")
28+
}
29+
30+
@Serializable
31+
data class Dev(val name: String, val language: Language)
32+
33+
@Test
34+
fun `when serialize enum field with kotlinx @SerialName, then get expected result`() {
35+
val dev = Dev("Kai", Language.JAVA)
36+
val json = Json.encodeToString(dev)
37+
assertEquals("""{"name":"Kai","language":"Java_is_great"}""", json)
38+
}
39+
40+
}
41+
42+
class EnumFieldKotlinx2UnitTest {
43+
class LanguageSerializer : KSerializer<Language> {
44+
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Language", PrimitiveKind.STRING)
45+
46+
override fun deserialize(decoder: Decoder): Language {
47+
val desc = decoder.decodeString()
48+
return Language.entries.first { desc == it.description }
49+
}
50+
51+
override fun serialize(encoder: Encoder, value: Language) {
52+
encoder.encodeString(value.description)
53+
}
54+
}
55+
56+
@Serializable(with = LanguageSerializer::class)
57+
enum class Language(val description: String) {
58+
KOTLIN("Kotlin_is_awesome"),
59+
JAVA("Java_is_great"),
60+
GO("Go_is_nice")
61+
}
62+
63+
@Serializable
64+
data class Dev(val name: String, val language: Language)
65+
66+
@Test
67+
fun `when serialize enum field with a custom serializer, then get expected result`() {
68+
val dev = Dev("Kai", Language.JAVA)
69+
val json = Json.encodeToString(dev)
70+
assertEquals("""{"name":"Kai","language":"Java_is_great"}""", json)
71+
}
72+
}

pom.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@
394394
<module>kotlin-immutable-collections</module>
395395
<!-- <module>kotlin-js</module> --> <!-- not a Maven module -->
396396
<module>kotlin-json</module>
397+
<module>kotlin-json-2</module>
397398
<!-- <module>kotlin-ktor</module> --> <!-- not a Maven module -->
398399
<module>kotlin-lambda</module>
399400
<module>kotlin-libraries</module>
@@ -474,6 +475,7 @@
474475
<module>kotlin-immutable-collections</module>
475476
<!-- <module>kotlin-js</module> --> <!-- not a Maven module -->
476477
<module>kotlin-json</module>
478+
<module>kotlin-json-2</module>
477479
<!-- <module>kotlin-ktor</module> --> <!-- not a Maven module -->
478480
<module>kotlin-lambda</module>
479481
<module>kotlin-libraries</module>

0 commit comments

Comments
 (0)