Skip to content

Commit ed785c7

Browse files
committed
refactor scala number deserialization to reuse java equivalents (#574)
1 parent 754185c commit ed785c7

File tree

1 file changed

+18
-63
lines changed

1 file changed

+18
-63
lines changed

src/main/scala/com/fasterxml/jackson/module/scala/deser/ScalaNumberDeserializersModule.scala

Lines changed: 18 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -2,83 +2,38 @@ package com.fasterxml.jackson
22
package module.scala
33
package deser
44

5-
import com.fasterxml.jackson.core.JsonToken.{START_ARRAY, VALUE_NUMBER_FLOAT, VALUE_NUMBER_INT, VALUE_STRING}
6-
import com.fasterxml.jackson.core.io.BigDecimalParser
7-
import com.fasterxml.jackson.core.{JsonParser, JsonToken}
8-
import com.fasterxml.jackson.databind.DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS
9-
import com.fasterxml.jackson.databind.JacksonModule.SetupContext
10-
import com.fasterxml.jackson.databind._
5+
import com.fasterxml.jackson.core.JsonParser
116
import com.fasterxml.jackson.databind.deser.Deserializers
127
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer
13-
import com.fasterxml.jackson.module.scala.JacksonModule.InitializerBuilder
14-
import com.fasterxml.jackson.module.scala.{JacksonModule => JacksonScalaModule}
15-
16-
import scala.reflect.{ClassTag, classTag}
8+
import com.fasterxml.jackson.databind._
9+
import com.fasterxml.jackson.databind.deser.std.NumberDeserializers.{
10+
BigDecimalDeserializer => JavaBigDecimalDeserializer, BigIntegerDeserializer
11+
}
1712

18-
private abstract class BigNumberDeserializer[T >: Null : ClassTag](creator: (String) => T)
19-
extends StdScalarDeserializer[T](classTag[T].runtimeClass)
20-
{
21-
override def deserialize(jp: JsonParser, ctxt: DeserializationContext): T = {
22-
val t = jp.currentToken()
23-
t match {
24-
case VALUE_NUMBER_INT | VALUE_NUMBER_FLOAT => creator(jp.getText.trim)
25-
case VALUE_STRING =>
26-
val text = jp.getText.trim
27-
if (text.isEmpty) None.orNull else try {
28-
creator(text)
29-
}
30-
catch {
31-
case _: IllegalArgumentException => throw ctxt.weirdStringException(text, _valueClass, "not a valid representation")
32-
}
33-
case START_ARRAY if ctxt.isEnabled(UNWRAP_SINGLE_VALUE_ARRAYS) =>
34-
jp.nextToken()
35-
val value = deserialize(jp, ctxt)
36-
if (jp.nextToken() != JsonToken.END_ARRAY) {
37-
throw ctxt.wrongTokenException(jp, ctxt.getContextualType,
38-
JsonToken.END_ARRAY, "Attempted to unwrap array for single value but there was more than a single value in the array")
39-
}
40-
value
41-
case _ =>
42-
ctxt.handleUnexpectedToken(_valueType, jp).asInstanceOf[T]
43-
}
13+
private object BigDecimalDeserializer extends StdScalarDeserializer[BigDecimal](classOf[BigDecimal]) {
14+
override def deserialize(p: JsonParser, ctxt: DeserializationContext): BigDecimal = {
15+
JavaBigDecimalDeserializer.instance.deserialize(p, ctxt)
4416
}
4517
}
4618

47-
private object ScalaBigDecimalParser {
48-
def fromString(str: String): BigDecimal = BigDecimalParser.parse(str)
19+
private object BigIntDeserializer extends StdScalarDeserializer[BigInt](classOf[BigInt]) {
20+
override def deserialize(p: JsonParser, ctxt: DeserializationContext): BigInt = {
21+
BigIntegerDeserializer.instance.deserialize(p, ctxt)
22+
}
4923
}
5024

51-
private object BigDecimalDeserializer extends BigNumberDeserializer(ScalaBigDecimalParser.fromString)
52-
53-
private object BigIntDeserializer extends BigNumberDeserializer(BigInt.apply)
25+
private object NumberDeserializers extends Deserializers.Base {
26+
private val BigDecimalClass = classOf[BigDecimal]
27+
private val BigIntClass = classOf[BigInt]
5428

55-
private class NumberDeserializers(config: ScalaModule.Config) extends Deserializers.Base
56-
{
57-
private val BigDecimalClass = BigDecimalDeserializer.handledType()
58-
private val BigIntClass = BigIntDeserializer.handledType()
59-
60-
override def findBeanDeserializer(tpe: JavaType, deserializationConfig: DeserializationConfig, beanDesc: BeanDescription): ValueDeserializer[_] =
29+
override def findBeanDeserializer(tpe: JavaType, config: DeserializationConfig, beanDesc: BeanDescription): JsonDeserializer[_] =
6130
tpe.getRawClass match {
6231
case BigDecimalClass => BigDecimalDeserializer
6332
case BigIntClass => BigIntDeserializer
6433
case _ => None.orNull
6534
}
66-
67-
override def hasDeserializerFor(deserializationConfig: DeserializationConfig, valueType: Class[_]): Boolean = {
68-
valueType match {
69-
case BigDecimalClass => true
70-
case BigIntClass => true
71-
case _ => false
72-
}
73-
}
7435
}
7536

76-
trait ScalaNumberDeserializersModule extends JacksonScalaModule {
77-
override def getInitializers(config: ScalaModule.Config): Seq[SetupContext => Unit] = {
78-
val builder = new InitializerBuilder()
79-
builder += new NumberDeserializers(config)
80-
builder.build()
81-
}
37+
trait ScalaNumberDeserializersModule extends JacksonModule {
38+
this += NumberDeserializers
8239
}
83-
84-
object ScalaNumberDeserializersModule extends ScalaNumberDeserializersModule

0 commit comments

Comments
 (0)