Skip to content

Commit

Permalink
First pass at #148
Browse files Browse the repository at this point in the history
  • Loading branch information
christophercurrie committed Nov 25, 2014
1 parent 930c2ec commit cd04f5e
Showing 1 changed file with 22 additions and 23 deletions.
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package com.fasterxml.jackson.module.scala.deser

import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.{DeserializationFeature, JavaType, BeanDescription, DeserializationConfig, DeserializationContext}
import com.fasterxml.jackson.databind.deser.Deserializers
import com.fasterxml.jackson.databind.deser.std
import com.fasterxml.jackson.module.scala.JacksonModule
import com.fasterxml.jackson.module.scala.util.Implicits._
import java.{util => ju}
import scala.collection.JavaConverters._

import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.core.`type`.TypeReference
import com.fasterxml.jackson.databind.deser.{Deserializers, std}
import com.fasterxml.jackson.databind.{BeanDescription, DeserializationConfig, DeserializationContext, DeserializationFeature, JavaType, JsonDeserializer}
import com.fasterxml.jackson.module.scala.JacksonModule

object UntypedObjectDeserializer
{
Expand All @@ -17,32 +15,33 @@ object UntypedObjectDeserializer
}

private class UntypedObjectDeserializer extends std.UntypedObjectDeserializer {
import UntypedObjectDeserializer._

private var _mapDeser: JsonDeserializer[AnyRef] = _
private var _listDeser: JsonDeserializer[AnyRef] = _

override def resolve(ctxt: DeserializationContext) {
super.resolve(ctxt)
val anyRef = ctxt.constructType(classOf[AnyRef])
val string = ctxt.constructType(classOf[String])
val factory = ctxt.getFactory
val tf = ctxt.getTypeFactory
_mapDeser = ctxt.findRootValueDeserializer(
factory.mapAbstractType(ctxt.getConfig, tf.constructMapLikeType(classOf[collection.Map[_,_]], string, anyRef)))
_listDeser = ctxt.findRootValueDeserializer(
factory.mapAbstractType(ctxt.getConfig, tf.constructCollectionLikeType(classOf[collection.Seq[_]], anyRef)))
}

override def mapArray(jp: JsonParser, ctxt: DeserializationContext): AnyRef = {
if (ctxt.isEnabled(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY)) {
mapArrayToArray(jp, ctxt)
}
else {
val factory = ctxt.getTypeFactory
val seqType = factory.constructType(SEQ)
deserializeAbstractType(jp, ctxt, seqType) getOrElse {
super.mapArray(jp, ctxt).asInstanceOf[ju.List[AnyRef]].asScala
}
_listDeser.deserialize(jp, ctxt)
}
}

override def mapObject(jp: JsonParser, ctxt: DeserializationContext): AnyRef = {
val factory = ctxt.getTypeFactory
val mapType = factory.constructType(MAP)
deserializeAbstractType(jp, ctxt, mapType) getOrElse {
super.mapObject(jp, ctxt).asInstanceOf[ju.Map[String, AnyRef]].asScala
}
}

private def deserializeAbstractType(jp: JsonParser, ctxt: DeserializationContext, javaType: JavaType): Option[AnyRef] = {
val concreteType = ctxt.getFactory.mapAbstractType(ctxt.getConfig, javaType)
Option(concreteType) optMap { ctxt.findRootValueDeserializer } map { _.deserialize(jp, ctxt) }
_mapDeser.deserialize(jp, ctxt)
}
}

Expand Down

0 comments on commit cd04f5e

Please sign in to comment.