Skip to content

Commit

Permalink
A real fix for #32
Browse files Browse the repository at this point in the history
  • Loading branch information
christophercurrie committed Oct 2, 2012
1 parent df9c030 commit 2a30769
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -1,22 +1,53 @@
package com.fasterxml.jackson.module.scala.ser

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.{BeanDescription, JavaType, JsonSerializer, SerializationConfig, SerializerProvider};
import com.fasterxml.jackson.databind.ser.Serializers
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.databind.{BeanDescription, JavaType, JsonSerializer, SerializationConfig, SerializerProvider}
import com.fasterxml.jackson.databind.ser.{BeanPropertyWriter, BeanSerializerModifier, Serializers}
import com.fasterxml.jackson.module.scala.modifiers.OptionTypeModifierModule
import scala.collection.JavaConverters._
import java.{util => ju}

private class OptionSerializer extends JsonSerializer[Option[_]] {

def serialize(value: Option[_], jgen: JsonGenerator, provider: SerializerProvider) {
value match {
case Some(v) => jgen.writeObject(v)
case None => jgen.writeNull()
case Some(v) => provider.defaultSerializeValue(v, jgen)
case None => provider.defaultSerializeNull(jgen)
}
}

override def isEmpty(value: Option[_]): Boolean = value.isEmpty
}

private class OptionPropertyWriter(delegate: BeanPropertyWriter) extends BeanPropertyWriter(delegate)
{
override def serializeAsField(bean: AnyRef, jgen: JsonGenerator, prov: SerializerProvider) {
(get(bean), _nullSerializer) match {
// value is None, which we'll serialize as null, but there's no
// null-serializer, which means it should be suppressed
case (None, null) => return
case _ => super.serializeAsField(bean, jgen, prov)
}
}
}

private object OptionBeanSerializerModifier extends BeanSerializerModifier {

override def changeProperties(config: SerializationConfig,
beanDesc: BeanDescription,
beanProperties: ju.List[BeanPropertyWriter]): ju.List[BeanPropertyWriter] = {

beanProperties.asScala.transform { w =>
if (classOf[Option[_]].isAssignableFrom(w.getPropertyType))
new OptionPropertyWriter(w)
else
w
}.asJava

}

}

private object OptionSerializerResolver extends Serializers.Base {

private val OPTION = classOf[Option[_]]
Expand All @@ -27,6 +58,11 @@ private object OptionSerializerResolver extends Serializers.Base {

}



trait OptionSerializerModule extends OptionTypeModifierModule {
this += (_ addSerializers OptionSerializerResolver)
}
this += { ctx =>
ctx addSerializers OptionSerializerResolver
ctx addBeanSerializerModifier OptionBeanSerializerModifier
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ trait JacksonTest {

def module: Module

val mapper = {
def mapper = {
val result = new ObjectMapper
result.registerModule(module)
result
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.annotation.{JsonProperty, JsonInclude}
import annotation.target.getter

class NonEmptyOptions {

Expand Down Expand Up @@ -62,4 +63,15 @@ class OptionSerializerTest extends SerializerTest with FlatSpec with ShouldMatch
serialize(new NonEmptyOptions) should be ("""{"some":1}""")
}

it should "honor JsonInclude.Include.NON_NULL" in {
val nonNullMapper = mapper
nonNullMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL)
nonNullMapper.writeValueAsString(new NonNullOption()) should be ("{}")
}

}

class NonNullOption {
@JsonProperty var foo: Option[String] = None
}

0 comments on commit 2a30769

Please sign in to comment.