@@ -10,39 +10,55 @@ import tools.jackson.databind.ValueDeserializer
1010import tools.jackson.databind.ValueSerializer
1111import tools.jackson.databind.deser.std.StdDeserializer
1212import tools.jackson.databind.ser.std.StdSerializer
13+ import java.math.BigDecimal
14+ import java.math.BigInteger
1315
1416internal class JsonNullableSerializer : StdSerializer <JsonNullable <* >> {
15- private val valueType : JavaType ?
16- private val valueSerializer : ValueSerializer <Any ?>?
17+ private val childType : JavaType ?
18+ private val childSerializer : ValueSerializer <Any ?>?
1719
1820 constructor () : super (JsonNullable ::class .java) {
19- this .valueType = null
20- this .valueSerializer = null
21+ this .childType = null
22+ this .childSerializer = null
2123 }
2224
2325 constructor (
2426 source: JsonNullableSerializer ,
25- valueType : JavaType ,
26- valueSerializer : ValueSerializer <Any ?>,
27+ childType : JavaType ,
28+ childSerializer : ValueSerializer <Any ?>,
2729 ) : super (source) {
28- this .valueType = valueType
29- this .valueSerializer = valueSerializer
30+ this .childType = childType
31+ this .childSerializer = childSerializer
3032 }
3133
3234 override fun createContextual (context : SerializationContext , property : BeanProperty ? ): ValueSerializer <* > {
33- val type = property?.type ? : TODO ()
34- val valueType = type .containedTypeOrUnknown(0 )
35- val valueSerializer = context.findValueSerializer(valueType )
36- if (valueType == this .valueType && valueSerializer == this .valueSerializer ) return this
37- return JsonNullableSerializer (this , valueType, valueSerializer )
35+ val parentType = property?.type ? : return this
36+ val childType = parentType .containedTypeOrUnknown(0 )
37+ val childSerializer = context.findValueSerializer(childType )
38+ if (childType == this .childType && childSerializer == this .childSerializer ) return this
39+ return JsonNullableSerializer (this , childType, childSerializer )
3840 }
3941
4042 override fun serialize (value : JsonNullable <Any ?>, generator : JsonGenerator , context : SerializationContext ) {
4143 if (value !is JsonNullable .Present || value.value == null ) {
4244 generator.writeNull()
45+ } else if (childSerializer == null ) {
46+ when (value.value) {
47+ is Boolean -> generator.writeBoolean(value.value)
48+
49+ is String -> generator.writeString(value.value)
50+
51+ is Int -> generator.writeNumber(value.value)
52+ is Long -> generator.writeNumber(value.value)
53+ is Float -> generator.writeNumber(value.value)
54+ is Double -> generator.writeNumber(value.value)
55+ is BigInteger -> generator.writeNumber(value.value)
56+ is BigDecimal -> generator.writeNumber(value.value)
57+
58+ else -> generator.writePOJO(value.value)
59+ }
4360 } else {
44- checkNotNull(valueSerializer)
45- valueSerializer.serialize(value.value, generator, context)
61+ childSerializer.serialize(value.value, generator, context)
4662 }
4763 }
4864
@@ -51,34 +67,34 @@ internal class JsonNullableSerializer : StdSerializer<JsonNullable<*>> {
5167}
5268
5369internal class JsonNullableDeserializer : StdDeserializer <JsonNullable <* >> {
54- private val valueType : JavaType ?
55- private val valueDeserializer : ValueDeserializer <* >?
70+ private val childType : JavaType ?
71+ private val childDeserializer : ValueDeserializer <* >?
5672
5773 constructor () : super (JsonNullable ::class .java) {
58- this .valueType = null
59- this .valueDeserializer = null
74+ this .childType = null
75+ this .childDeserializer = null
6076 }
6177
6278 constructor (
6379 source: JsonNullableDeserializer ,
64- valueType : JavaType ,
65- valueDeserializer : ValueDeserializer <* >,
80+ childType : JavaType ,
81+ childDeserializer : ValueDeserializer <* >,
6682 ) : super (source) {
67- this .valueType = valueType
68- this .valueDeserializer = valueDeserializer
83+ this .childType = childType
84+ this .childDeserializer = childDeserializer
6985 }
7086
7187 override fun createContextual (context : DeserializationContext , property : BeanProperty ? ): ValueDeserializer <* > {
72- val type = property?.type ? : context.contextualType
73- val valueType = type .containedTypeOrUnknown(0 )
74- val valueDeserializer = context.findContextualValueDeserializer(valueType, null )
75- if (valueType == this .valueType && valueDeserializer == this .valueDeserializer ) return this
76- return JsonNullableDeserializer (this , valueType, valueDeserializer )
88+ val parentType = property?.type ? : context.contextualType
89+ val childType = parentType .containedTypeOrUnknown(0 )
90+ val childDeserializer = context.findContextualValueDeserializer(childType, property )
91+ if (childType == this .childType && childDeserializer == this .childDeserializer ) return this
92+ return JsonNullableDeserializer (this , childType, childDeserializer )
7793 }
7894
7995 override fun deserialize (parser : JsonParser , context : DeserializationContext ): JsonNullable <* > {
80- checkNotNull(valueDeserializer )
81- val value = valueDeserializer .deserialize(parser, context)
96+ checkNotNull(childDeserializer )
97+ val value = childDeserializer .deserialize(parser, context)
8298 return JsonNullable .Present (value)
8399 }
84100
0 commit comments