Resolved, had to implement custom JsonFormat:
implicit object CurrencyJsonFormat extends RootJsonFormat[Currency.CurrencyType] {
import com.ebay.krylov.conf.KrylovConf
import com.ebay.krylov.provisioner.common.Constants._
import spray.json.DefaultJsonProtocol._
import spray.json.{RootJsonFormat, _}
import scala.collection.immutable.Seq
import org.scalatest.{Matchers, WordSpec}
import spray.json.{JsString, JsValue, RootJsonFormat, _}
class EnumJsonConversionTest extends WordSpec with Matchers {
object Animal extends Enumeration {
type Animal = Value
val DOG, CAT, FISH, BIRD = Value
}
def jsonEnum[T <: Enumeration](enum: T) = new JsonFormat[T#Value] {
def write(obj: T#Value) = JsString(obj.toString)
def read(json: JsValue) = json match {
case JsString(txt) => enum.withName(txt)
case something => throw new DeserializationException(s"Expected a value from enum $enum instead of $something")
}
}
class EnumJsonConverter[T <: scala.Enumeration](enu: T) extends RootJsonFormat[T#Value] {
def write(obj: T#Value) = JsString(obj.toString)
def read(json: JsValue) = {
json match {
case JsString(txt) => enu.withName(txt)
case something => deserializationError(s"Expected a value from enum $enu instead of $something")
}
}
}
"JSON convertible enums" should {
implicit val converter = new EnumJsonConverter(Animal)
"ensure that a list of all values enum class should contain all of its elements" in {
val vals: Animal.ValueSet = Animal.values
vals.contains(Animal.DOG) shouldBe true // we won't bother to check the rest.... DOG should suffice
}
"convert objects containing Animal enum components to Json, & parse that Json back into the original object" in {
import Animal._
case class AnimalMap(name: String, map: Map[Animal,String]) // template for objects w/ Animal enum components
implicit val animalMapConverter = jsonFormat2(AnimalMap)
val mapAsJsonString = """{"name":"dogmap","map":{"DOG":"good dog!","CAT":"bad cat!"}}"""
val originalAnimalMap = AnimalMap("dogmap", Map(Animal.DOG -> "good dog!", Animal.CAT -> "bad cat!"))
val originalMapConvertedToJson: JsValue = originalAnimalMap.toJson
val parsedJson = mapAsJsonString.parseJson
System.out.println("parsedJson:" + parsedJson);
val jsonConvertedBackToAnimalMap: AnimalMap = parsedJson.convertTo[AnimalMap]
jsonConvertedBackToAnimalMap shouldEqual originalAnimalMap
}
}
}