diff --git a/release-notes/CREDITS-2.x b/release-notes/CREDITS-2.x index d6f45d6d..87c27a6f 100644 --- a/release-notes/CREDITS-2.x +++ b/release-notes/CREDITS-2.x @@ -18,6 +18,7 @@ Contributors: # 2.17.0 (not yet released) WrongWrong (@k163377) +* #763: Minor refactoring to support value class in deserialization. * #760: Improved processing related to parameter parsing on Kotlin. * #759: Organize internal commons. * #758: Deprecated SingletonSupport. diff --git a/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinDeserializers.kt b/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinDeserializers.kt index ce8bcf4f..88c179ae 100644 --- a/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinDeserializers.kt +++ b/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinDeserializers.kt @@ -102,14 +102,16 @@ internal class KotlinDeserializers( config: DeserializationConfig?, beanDesc: BeanDescription?, ): JsonDeserializer<*>? { + val rawClass = type.rawClass + return when { - type.isInterface && type.rawClass == Sequence::class.java -> SequenceDeserializer - type.rawClass == Regex::class.java -> RegexDeserializer - type.rawClass == UByte::class.java -> UByteDeserializer - type.rawClass == UShort::class.java -> UShortDeserializer - type.rawClass == UInt::class.java -> UIntDeserializer - type.rawClass == ULong::class.java -> ULongDeserializer - type.rawClass == KotlinDuration::class.java -> + type.isInterface && rawClass == Sequence::class.java -> SequenceDeserializer + rawClass == Regex::class.java -> RegexDeserializer + rawClass == UByte::class.java -> UByteDeserializer + rawClass == UShort::class.java -> UShortDeserializer + rawClass == UInt::class.java -> UIntDeserializer + rawClass == ULong::class.java -> ULongDeserializer + rawClass == KotlinDuration::class.java -> JavaToKotlinDurationConverter.takeIf { useJavaDurationConversion }?.delegatingDeserializer else -> null } diff --git a/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinValueInstantiator.kt b/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinValueInstantiator.kt index dee807ca..899d2484 100644 --- a/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinValueInstantiator.kt +++ b/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinValueInstantiator.kt @@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.BeanDescription import com.fasterxml.jackson.databind.DeserializationConfig import com.fasterxml.jackson.databind.DeserializationContext import com.fasterxml.jackson.databind.JavaType +import com.fasterxml.jackson.databind.JsonDeserializer import com.fasterxml.jackson.databind.deser.SettableBeanProperty import com.fasterxml.jackson.databind.deser.ValueInstantiator import com.fasterxml.jackson.databind.deser.ValueInstantiators @@ -47,14 +48,15 @@ internal class KotlinValueInstantiator( valueCreator.valueParameters.forEachIndexed { idx, paramDef -> val jsonProp = props[idx] val isMissing = !buffer.hasParameter(jsonProp) + val valueDeserializer: JsonDeserializer<*>? by lazy { jsonProp.valueDeserializer } val paramType = paramDef.type var paramVal = if (!isMissing || jsonProp.hasInjectableValueId()) { - val tempParamVal = buffer.getParameter(jsonProp) - if (tempParamVal == null && jsonProp.skipNulls() && paramDef.isOptional) { - return@forEachIndexed - } - tempParamVal + buffer.getParameter(jsonProp) ?: run { + if (jsonProp.skipNulls() && paramDef.isOptional) return@forEachIndexed + + null + } } else { when { paramDef.isOptional || paramDef.isVararg -> return@forEachIndexed @@ -63,7 +65,7 @@ internal class KotlinValueInstantiator( // Primitive types always try to get from a buffer, considering several settings jsonProp.type.isPrimitive -> buffer.getParameter(jsonProp) // to get suitable "missing" value provided by deserializer - else -> jsonProp.valueDeserializer?.getAbsentValue(ctxt) + else -> valueDeserializer?.getAbsentValue(ctxt) } } @@ -71,7 +73,7 @@ internal class KotlinValueInstantiator( if (paramVal == null) { if (propType.requireEmptyValue()) { - paramVal = jsonProp.valueDeserializer!!.getEmptyValue(ctxt) + paramVal = valueDeserializer!!.getEmptyValue(ctxt) } else { val isMissingAndRequired = isMissing && jsonProp.isRequired