Skip to content

Commit af34b2b

Browse files
authored
Merge pull request #368 from ProjectMapK/develop
Release 2025-07-06 07:43:08 +0000
2 parents e21dab9 + 119da0d commit af34b2b

17 files changed

Lines changed: 565 additions & 16 deletions

File tree

.github/workflows/test-main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jobs:
4242
# LTS versions, latest version (if exists)
4343
java-version: [ '17', '21', '24' ]
4444
# Minimum version, latest release version, latest pre-release version (if exists)
45-
kotlin: ['2.0.21', '2.1.20', '2.2.0-RC']
45+
kotlin: ['2.0.21', '2.1.21', '2.2.0']
4646
env:
4747
KOTLIN_VERSION: ${{ matrix.kotlin }}
4848
name: "Kotlin ${{ matrix.kotlin }} - Java ${{ matrix.java-version }}"

.junie/guidelines.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Spring Boot
2+
## 1. Perform formatting just before completing the task
3+
4+
```bash
5+
./gradlew formatKotlin
6+
```

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ val jacksonVersion = libs.versions.jackson.get()
1818
val generatedSrcPath = "${layout.buildDirectory.get()}/generated/kotlin"
1919

2020
group = groupStr
21-
version = "${jacksonVersion}-beta25"
21+
version = "${jacksonVersion}-beta26"
2222

2323
repositories {
2424
mavenCentral()

gradle/libs.versions.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
[versions]
22
kotlin = "2.0.21" # Mainly for CI, it can be rewritten by environment variable.
3-
jackson = "2.19.0"
3+
jackson = "2.19.1"
44

55
# test libs
6-
junit = "5.13.1"
6+
junit = "5.13.2"
77

88
[libraries]
99
kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib" }
@@ -14,7 +14,7 @@ jackson-annotations = { module = "com.fasterxml.jackson.core:jackson-annotations
1414
# test libs
1515
kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect" }
1616
junit-bom = { module = "org.junit:junit-bom", version.ref = "junit" }
17-
mockk = "io.mockk:mockk:1.14.2"
17+
mockk = "io.mockk:mockk:1.14.4"
1818
jackson-xml = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-xml", version.ref = "jackson" }
1919
jackson-csv = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-csv", version.ref = "jackson" }
2020
jackson-jsr310 = { module = "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", version.ref = "jackson" }

src/main/kotlin/io/github/projectmapk/jackson/module/kogera/InternalCommons.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,15 @@ internal val STRING_CLASS = String::class.java
7171
internal val JAVA_UUID_CLASS = java.util.UUID::class.java
7272
internal val ANY_CLASS = Any::class.java
7373

74-
internal val ANY_TO_ANY_METHOD_TYPE = MethodType.methodType(ANY_CLASS, ANY_CLASS)
75-
internal val ANY_TO_INT_METHOD_TYPE = MethodType.methodType(INT_CLASS, ANY_CLASS)
76-
internal val ANY_TO_LONG_METHOD_TYPE = MethodType.methodType(LONG_CLASS, ANY_CLASS)
77-
internal val ANY_TO_STRING_METHOD_TYPE = MethodType.methodType(STRING_CLASS, ANY_CLASS)
78-
internal val ANY_TO_JAVA_UUID_METHOD_TYPE = MethodType.methodType(JAVA_UUID_CLASS, ANY_CLASS)
79-
internal val INT_TO_ANY_METHOD_TYPE = MethodType.methodType(ANY_CLASS, INT_CLASS)
80-
internal val LONG_TO_ANY_METHOD_TYPE = MethodType.methodType(ANY_CLASS, LONG_CLASS)
81-
internal val STRING_TO_ANY_METHOD_TYPE = MethodType.methodType(ANY_CLASS, STRING_CLASS)
82-
internal val JAVA_UUID_TO_ANY_METHOD_TYPE = MethodType.methodType(ANY_CLASS, JAVA_UUID_CLASS)
74+
internal val ANY_TO_ANY_METHOD_TYPE by lazy { MethodType.methodType(ANY_CLASS, ANY_CLASS) }
75+
internal val ANY_TO_INT_METHOD_TYPE by lazy { MethodType.methodType(INT_CLASS, ANY_CLASS) }
76+
internal val ANY_TO_LONG_METHOD_TYPE by lazy { MethodType.methodType(LONG_CLASS, ANY_CLASS) }
77+
internal val ANY_TO_STRING_METHOD_TYPE by lazy { MethodType.methodType(STRING_CLASS, ANY_CLASS) }
78+
internal val ANY_TO_JAVA_UUID_METHOD_TYPE by lazy { MethodType.methodType(JAVA_UUID_CLASS, ANY_CLASS) }
79+
internal val INT_TO_ANY_METHOD_TYPE by lazy { MethodType.methodType(ANY_CLASS, INT_CLASS) }
80+
internal val LONG_TO_ANY_METHOD_TYPE by lazy { MethodType.methodType(ANY_CLASS, LONG_CLASS) }
81+
internal val STRING_TO_ANY_METHOD_TYPE by lazy { MethodType.methodType(ANY_CLASS, STRING_CLASS) }
82+
internal val JAVA_UUID_TO_ANY_METHOD_TYPE by lazy { MethodType.methodType(ANY_CLASS, JAVA_UUID_CLASS) }
8383

8484
internal fun unreflect(method: Method): MethodHandle = MethodHandles.lookup().unreflect(method)
8585
internal fun unreflectAsType(method: Method, type: MethodType): MethodHandle = unreflect(method).asType(type)

src/main/kotlin/io/github/projectmapk/jackson/module/kogera/ser/Converters.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ package io.github.projectmapk.jackson.module.kogera.ser
33
import com.fasterxml.jackson.databind.JavaType
44
import com.fasterxml.jackson.databind.type.TypeFactory
55
import com.fasterxml.jackson.databind.util.StdConverter
6-
import io.github.projectmapk.jackson.module.kogera.GenericValueClassBoxConverter
76
import io.github.projectmapk.jackson.module.kogera.JavaDuration
87
import io.github.projectmapk.jackson.module.kogera.KOTLIN_DURATION_CLASS
98
import io.github.projectmapk.jackson.module.kogera.KotlinDuration
9+
import io.github.projectmapk.jackson.module.kogera.LongValueClassBoxConverter
1010
import kotlin.time.toJavaDuration
1111

1212
internal class SequenceToIteratorConverter(private val input: JavaType) : StdConverter<Sequence<*>, Iterator<*>>() {
@@ -21,7 +21,7 @@ internal class SequenceToIteratorConverter(private val input: JavaType) : StdCon
2121
}
2222

2323
internal object KotlinDurationValueToJavaDurationConverter : StdConverter<Long, JavaDuration>() {
24-
private val boxConverter by lazy { GenericValueClassBoxConverter(Long::class.java, KOTLIN_DURATION_CLASS) }
24+
private val boxConverter by lazy { LongValueClassBoxConverter(KOTLIN_DURATION_CLASS) }
2525

2626
override fun convert(value: Long): JavaDuration = KotlinToJavaDurationConverter.convert(boxConverter.convert(value))
2727
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonKey
2+
3+
import com.fasterxml.jackson.annotation.JsonKey
4+
import io.github.projectmapk.jackson.module.kogera.defaultMapper
5+
import org.junit.jupiter.api.Assertions.assertEquals
6+
import org.junit.jupiter.api.Test
7+
8+
class NonNullObjectTest {
9+
@JvmInline
10+
value class NonNull(val v: String) {
11+
@JsonKey
12+
fun jsonValue() = v + "_modified"
13+
}
14+
15+
@Test
16+
fun nonNullTest() {
17+
assertEquals(
18+
"""{"test_modified":null}""",
19+
defaultMapper.writeValueAsString(mapOf(NonNull("test") to null)),
20+
)
21+
}
22+
23+
@JvmInline
24+
value class Nullable(val v: String) {
25+
@JsonKey
26+
fun jsonValue() = v.takeIf { it.length % 2 == 0 }?.let { it + "_modified" }
27+
}
28+
29+
// The case of returning null as a key is unnecessary because it will result in an error
30+
@Test
31+
fun nullableTest() {
32+
assertEquals(
33+
"""{"test_modified":null}""",
34+
defaultMapper.writeValueAsString(mapOf(Nullable("test") to null)),
35+
)
36+
}
37+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonKey
2+
3+
import com.fasterxml.jackson.annotation.JsonKey
4+
import io.github.projectmapk.jackson.module.kogera.defaultMapper
5+
import org.junit.jupiter.api.Assertions.assertEquals
6+
import org.junit.jupiter.api.Test
7+
8+
class NullableObjectTest {
9+
@JvmInline
10+
value class Value(val v: String?) {
11+
@JsonKey
12+
fun jsonValue() = v?.let { it + "_modified" }
13+
}
14+
15+
// The case of returning null as a key is unnecessary because it will result in an error
16+
@Test
17+
fun test() {
18+
assertEquals(
19+
"""{"test_modified":null}""",
20+
defaultMapper.writeValueAsString(mapOf(Value("test") to null)),
21+
)
22+
}
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonKey
2+
3+
import com.fasterxml.jackson.annotation.JsonKey
4+
import io.github.projectmapk.jackson.module.kogera.defaultMapper
5+
import org.junit.jupiter.api.Assertions.assertEquals
6+
import org.junit.jupiter.api.Test
7+
8+
class NullablePrimitiveTest {
9+
@JvmInline
10+
value class Value(val v: Int?) {
11+
@JsonKey
12+
fun jsonValue() = v?.let { it + 100 }
13+
}
14+
15+
// The case of returning null as a key is unnecessary because it will result in an error
16+
@Test
17+
fun test() {
18+
assertEquals(
19+
"""{"100":null}""",
20+
defaultMapper.writeValueAsString(mapOf(Value(0) to null)),
21+
)
22+
}
23+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.github.projectmapk.jackson.module.kogera.zIntegration.ser.valueClass.jsonKey
2+
3+
import com.fasterxml.jackson.annotation.JsonKey
4+
import io.github.projectmapk.jackson.module.kogera.defaultMapper
5+
import org.junit.jupiter.api.Assertions.assertEquals
6+
import org.junit.jupiter.api.Test
7+
8+
class PrimitiveTest {
9+
@JvmInline
10+
value class NonNull(val v: Int) {
11+
@JsonKey
12+
fun jsonValue() = v + 100
13+
}
14+
15+
@Test
16+
fun nonNullTest() {
17+
assertEquals(
18+
"""{"100":null}""",
19+
defaultMapper.writeValueAsString(mapOf(NonNull(0) to null)),
20+
)
21+
}
22+
23+
@JvmInline
24+
value class Nullable(val v: Int) {
25+
@JsonKey
26+
fun jsonValue() = v.takeIf { it % 2 == 0 }?.let { it + 100 }
27+
}
28+
29+
// The case of returning null as a key is unnecessary because it will result in an error
30+
@Test
31+
fun nullableTest() {
32+
assertEquals(
33+
"""{"100":null}""",
34+
defaultMapper.writeValueAsString(mapOf(Nullable(0) to null)),
35+
)
36+
}
37+
}

0 commit comments

Comments
 (0)