diff --git a/core-kotlin/pom.xml b/core-kotlin/pom.xml
index 24bfb302cf..1dd804eedd 100644
--- a/core-kotlin/pom.xml
+++ b/core-kotlin/pom.xml
@@ -98,13 +98,18 @@
${assertj.version}
test
+
+ com.beust
+ klaxon
+ ${klaxon.version}
+
- kotlin-maven-plugin
org.jetbrains.kotlin
+ kotlin-maven-plugin
${kotlin-maven-plugin.version}
@@ -200,20 +205,22 @@
UTF-8
- 1.2.31
- 1.2.31
- 1.2.31
- 1.2.31
- 0.15
+ 1.2.41
+ 1.2.41
+ 1.2.41
+ 1.2.41
+ 0.22.5
1.5.0
4.1.0
+ 3.0.4
+ 2.21.0
0.1.0
3.6.1
- 5.0.0
- 1.0.0
- 4.12.0
+ 5.2.0
+ 1.2.0
+ 5.2.0
4.12
- 3.9.1
+ 3.10.0
1.8
1.8
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/klaxon/CustomProduct.kt b/core-kotlin/src/main/kotlin/com/baeldung/klaxon/CustomProduct.kt
new file mode 100644
index 0000000000..cc46c65f96
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/klaxon/CustomProduct.kt
@@ -0,0 +1,9 @@
+package com.baeldung.klaxon
+
+import com.beust.klaxon.Json
+
+class CustomProduct(
+ @Json(name = "productName")
+ val name: String,
+ @Json(ignored = true)
+ val id: Int)
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/klaxon/Product.kt b/core-kotlin/src/main/kotlin/com/baeldung/klaxon/Product.kt
new file mode 100644
index 0000000000..09bcbc8722
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/klaxon/Product.kt
@@ -0,0 +1,3 @@
+package com.baeldung.klaxon
+
+class Product(val name: String)
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/klaxon/ProductData.kt b/core-kotlin/src/main/kotlin/com/baeldung/klaxon/ProductData.kt
new file mode 100644
index 0000000000..1f30f26ce9
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/klaxon/ProductData.kt
@@ -0,0 +1,3 @@
+package com.baeldung.klaxon
+
+data class ProductData(val name: String, val capacityInGb: Int)
\ No newline at end of file
diff --git a/core-kotlin/src/test/kotlin/com/baeldung/klaxon/KlaxonUnitTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/klaxon/KlaxonUnitTest.kt
new file mode 100644
index 0000000000..2a7d44a163
--- /dev/null
+++ b/core-kotlin/src/test/kotlin/com/baeldung/klaxon/KlaxonUnitTest.kt
@@ -0,0 +1,163 @@
+package com.baeldung.klaxon
+
+import com.beust.klaxon.JsonArray
+import com.beust.klaxon.JsonObject
+import com.beust.klaxon.JsonReader
+import com.beust.klaxon.Klaxon
+import com.beust.klaxon.Parser
+import com.beust.klaxon.PathMatcher
+import org.assertj.core.api.Assertions.assertThat
+import org.assertj.core.api.SoftAssertions.assertSoftly
+import org.junit.Assert
+import org.junit.jupiter.api.Test
+import java.io.StringReader
+import java.util.regex.Pattern
+
+class KlaxonUnitTest {
+
+ @Test
+ fun giveProduct_whenSerialize_thenGetJsonString() {
+ val product = Product("HDD")
+ val result = Klaxon().toJsonString(product)
+
+ assertThat(result).isEqualTo("""{"name" : "HDD"}""")
+ }
+
+ @Test
+ fun giveJsonString_whenDeserialize_thenGetProduct() {
+ val result = Klaxon().parse("""
+ {
+ "name" : "RAM"
+ }
+ """)
+
+ assertThat(result?.name).isEqualTo("RAM")
+ }
+
+ @Test
+ fun giveCustomProduct_whenSerialize_thenGetJsonString() {
+ val product = CustomProduct("HDD", 1)
+ val result = Klaxon().toJsonString(product)
+
+ assertThat(result).isEqualTo("""{"productName" : "HDD"}""")
+ }
+
+ @Test
+ fun giveJsonArray_whenStreaming_thenGetProductArray() {
+ val jsonArray = """
+ [
+ { "name" : "HDD", "capacityInGb" : 512 },
+ { "name" : "RAM", "capacityInGb" : 16 }
+ ]"""
+ val expectedArray = arrayListOf(ProductData("HDD", 512),
+ ProductData("RAM", 16))
+ val klaxon = Klaxon()
+ val productArray = arrayListOf()
+ JsonReader(StringReader(jsonArray)).use { reader ->
+ reader.beginArray {
+ while (reader.hasNext()) {
+ val product = klaxon.parse(reader)
+ productArray.add(product!!)
+ }
+ }
+ }
+
+ assertThat(productArray).hasSize(2).isEqualTo(expectedArray)
+ }
+
+ @Test
+ fun giveJsonString_whenParser_thenGetJsonObject() {
+ val jsonString = StringBuilder("""
+ {
+ "name" : "HDD",
+ "capacityInGb" : 512,
+ "sizeInInch" : 2.5
+ }
+ """)
+ val parser = Parser()
+ val json = parser.parse(jsonString) as JsonObject
+
+ assertThat(json).hasSize(3).containsEntry("name", "HDD").containsEntry("capacityInGb", 512).containsEntry("sizeInInch", 2.5)
+ }
+
+ @Suppress("UNCHECKED_CAST")
+ @Test
+ fun giveJsonStringArray_whenParser_thenGetJsonArray() {
+ val jsonString = StringBuilder("""
+ [
+ { "name" : "SDD" },
+ { "madeIn" : "Taiwan" },
+ { "warrantyInYears" : 5 }
+ ]""")
+ val parser = Parser()
+ val json = parser.parse(jsonString) as JsonArray
+
+ assertSoftly({ softly ->
+ softly.assertThat(json).hasSize(3)
+ softly.assertThat(json[0]["name"]).isEqualTo("SDD")
+ softly.assertThat(json[1]["madeIn"]).isEqualTo("Taiwan")
+ softly.assertThat(json[2]["warrantyInYears"]).isEqualTo(5)
+ })
+ }
+
+ @Test
+ fun givenJsonString_whenStreaming_thenProcess() {
+ val jsonString = """
+ {
+ "name" : "HDD",
+ "madeIn" : "Taiwan",
+ "warrantyInYears" : 5
+ "hasStock" : true
+ "capacitiesInTb" : [ 1, 2 ],
+ "features" : { "cacheInMb" : 64, "speedInRpm" : 7200 }
+ }"""
+
+ JsonReader(StringReader(jsonString)).use { reader ->
+ reader.beginObject {
+ while (reader.hasNext()) {
+ val readName = reader.nextName()
+ when (readName) {
+ "name" -> assertThat(reader.nextString()).isEqualTo("HDD")
+ "madeIn" -> assertThat(reader.nextString()).isEqualTo("Taiwan")
+ "warrantyInYears" -> assertThat(reader.nextInt()).isEqualTo(5)
+ "hasStock" -> assertThat(reader.nextBoolean()).isEqualTo(true)
+ "capacitiesInTb" -> assertThat(reader.nextArray()).contains(1, 2)
+ "features" -> assertThat(reader.nextObject()).containsEntry("cacheInMb", 64).containsEntry("speedInRpm", 7200)
+ else -> Assert.fail("Unexpected name: $readName")
+ }
+ }
+ }
+ }
+
+ }
+
+ @Test
+ fun givenDiskInventory_whenRegexMatches_thenGetTypes() {
+ val jsonString = """
+ {
+ "inventory" : {
+ "disks" : [
+ {
+ "type" : "HDD",
+ "sizeInGb" : 1000
+ },
+ {
+ "type" : "SDD",
+ "sizeInGb" : 512
+ }
+ ]
+ }
+ }"""
+ val pathMatcher = object : PathMatcher {
+ override fun pathMatches(path: String) = Pattern.matches(".*inventory.*disks.*type.*", path)
+
+ override fun onMatch(path: String, value: Any) {
+ when (path) {
+ "$.inventory.disks[0].type" -> assertThat(value).isEqualTo("HDD")
+ "$.inventory.disks[1].type" -> assertThat(value).isEqualTo("SDD")
+ }
+ }
+ }
+ Klaxon().pathMatcher(pathMatcher).parseJsonObject(StringReader(jsonString))
+ }
+}
\ No newline at end of file