All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jacks.map.scala Maven / Gradle / Ivy

The newest version!
// Copyright (C) 2011 - Will Glozer.  All rights reserved.

package com.lambdaworks.jacks

import scala.collection._
import scala.collection.generic._
import scala.collection.mutable.Builder

import com.fasterxml.jackson.core._
import com.fasterxml.jackson.core.JsonToken._
import com.fasterxml.jackson.databind._
import com.fasterxml.jackson.databind.ser.std.StdSerializer

class MapSerializer(t: JavaType) extends StdSerializer[GenMap[Any, Any]](t) {
  override def serialize(map: GenMap[Any, Any], g: JsonGenerator, p: SerializerProvider) {
    var kS, vS: JsonSerializer[AnyRef] = null
    var kC, vC: Class[_] = null

    g.writeStartObject()

    for ((k, v) <- map) {
      val kA = k.asInstanceOf[AnyRef]
      val vA = v.asInstanceOf[AnyRef]

      if (kA.getClass ne kC) {
        kC = kA.getClass
        kS = p.findKeySerializer(p.constructType(kC), null)
      }
      kS.serialize(kA, g, p)

      if (vA ne null) {
        if (vA.getClass ne vC) {
          vC = vA.getClass
          vS = p.findValueSerializer(vC, null)
        }
        vS.serialize(vA, g, p)
      } else {
        p.defaultSerializeNull(g)
      }
    }

    g.writeEndObject()
  }

  override def isEmpty(v: GenMap[Any, Any]) = v.isEmpty
}

abstract class GenMapDeserializer[K, V](k: JavaType, v: JavaType) extends JsonDeserializer[GenMap[_, _]] {
  def newBuilder: Builder[(K, V), GenMap[K, V]]

  override def deserialize(p: JsonParser, ctx: DeserializationContext): GenMap[_, _] = {
    val kD = ctx.findKeyDeserializer(k, null)
    val vD = ctx.findContextualValueDeserializer(v, null)
    val builder = newBuilder

    if (p.getCurrentToken != START_OBJECT) throw ctx.mappingException(classOf[GenMap[_, _]])

    while (p.nextToken == FIELD_NAME) {
      val name = p.getCurrentName

      val key = kD match {
        case kD:KeyDeserializer => kD.deserializeKey(name, ctx)
        case null               => name
      }

      val value = p.nextToken match {
        case VALUE_NULL => vD.getNullValue
        case _          => vD.deserialize(p, ctx)
      }

      builder += ((key.asInstanceOf[K], value.asInstanceOf[V]))
    }

    builder.result
  }
}

class MapDeserializer[K, V](f: GenMapFactory[GenMap], k: JavaType, v: JavaType)
  extends GenMapDeserializer[K, V](k, v) {
    def newBuilder = f.newBuilder
}

class SortedMapDeserializer[K, V](f: SortedMapFactory[SortedMap], o: Ordering[K], k: JavaType, v: JavaType)
  extends GenMapDeserializer[K, V](k, v) {
    def newBuilder = f.newBuilder(o)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy