You need to defined Reads
for Color
to be consistent with rest of Play Json infrastructure, like:
import scala.util._
import play.api.libs.json._
import java.awt.Color
case class Options(color: Color)
object Options {
implicit val colorReads: Reads[Color] = {
implicitly[Reads[String]].flatMapResult { value =>
def invalidColor(cause: Throwable) = {
JsError(JsonValidationError(s"Invalid color value: `$value`. Error: ${cause.getMessage}"))
}
def validColor(color: Color) = {
JsSuccess(color)
}
Try(Color.decode(value)).fold(invalidColor, validColor)
}
}
implicit val reads: Reads[Options] = Json.reads
}
val jsonString = """ { "color": "#abcdef" }""".stripMargin
/*
* Prints out: Options(java.awt.Color[r=171,g=205,b=239])
*/
println(Json.parse(jsonString).as[Options])
val invalidColorJsonString = """ { "color": "invalid_color" }""".stripMargin
/*
* Prints out: JsError(List((/color,List(JsonValidationError(List(Invalid color value: `invalid_color`. Error: For input string: "invalid_color"),WrappedArray())))))
*/
println(Json.parse(invalidColorJsonString).validate[Options])
Used scala: 2.12, sbt: 1.4.7, Play Json: 2.9.2