Skip to content

Instantly share code, notes, and snippets.

@raelg
Created January 20, 2015 16:44
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save raelg/e12d731ba01ba58f0006 to your computer and use it in GitHub Desktop.
Save raelg/e12d731ba01ba58f0006 to your computer and use it in GitHub Desktop.
Scala Gson Serializer
package services
import java.lang.reflect.Type
import com.google.gson._
import org.joda.time.format.ISODateTimeFormat
import org.joda.time.{DateTime, DateTimeZone}
object Serializers {
val DATE_TIME_FORMATTER = ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC)
lazy val gson = new GsonBuilder()
.registerTypeHierarchyAdapter(classOf[Seq[Any]], new ListSerializer)
.registerTypeHierarchyAdapter(classOf[Map[Any,Any]], new MapSerializer)
.registerTypeHierarchyAdapter(classOf[Option[Any]], new OptionSerializer)
.registerTypeAdapter(classOf[DateTime], new DateTimeSerializer)
.create()
class ListSerializer extends JsonSerializer[Seq[Any]] {
override def serialize(src: Seq[Any], typeOfSrc: Type, context: JsonSerializationContext): JsonElement = {
import scala.collection.JavaConverters._
context.serialize(src.toList.asJava)
}
}
class MapSerializer extends JsonSerializer[Map[Any,Any]] {
override def serialize(src: Map[Any,Any], typeOfSrc: Type, context: JsonSerializationContext): JsonElement = {
import scala.collection.JavaConverters._
context.serialize(src.asJava)
}
}
class OptionSerializer extends JsonSerializer[Option[Any]] {
override def serialize(src: Option[Any], typeOfSrc: Type, context: JsonSerializationContext): JsonElement = {
src match {
case None => JsonNull.INSTANCE
case Some(v) => context.serialize(v)
}
}
}
class DateTimeSerializer extends JsonSerializer[DateTime] {
override def serialize(src: DateTime, typeOfSrc: Type, context: JsonSerializationContext): JsonElement = {
new JsonPrimitive(DATE_TIME_FORMATTER.print(src))
}
}
}
@malviyarahul2001
Copy link

Neat way to handle Gson serializations in scala. Saved me a lot of time. Thanks.

@romovpa
Copy link

romovpa commented Apr 4, 2018

This is awesome, thanks a lot!

@benckx
Copy link

benckx commented Sep 7, 2018

Thanks for that!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment