Circe support for playframework
How to get it
- Add dependency
For play 2.6.x
libraryDependencies += "com.dripower" %% "play-circe" % "2612.0"
For play 2.7.x
libraryDependencies += "com.dripower" %% "play-circe" % "2712.0"
For play 2.8.x
libraryDependencies += "com.dripower" %% "play-circe" % "2814.1"
Usage
package play.api.libs.circe
import io.circe.generic.auto._
import io.circe.syntax._
import play.api._
import play.api.mvc._
class CirceController(val controllerComponents: ControllerComponents) extends BaseController with Circe {
case class Bar(bar: Int)
case class Foo(foo: String, bar: Bar)
val bar = Bar(1)
val foo = Foo("foo", bar)
//serve json
def get = Action {
Ok(foo.asJson)
}
//parse json to case class
def post = Action(circe.json[Foo]) { implicit request =>
val isEqual = request.body == foo
Ok(isEqual.toString)
}
def postJson = Action(circe.json) { implicit request =>
val isEqual = request.body == foo.asJson
Ok(isEqual.toString)
}
def postTolerate = Action(circe.tolerantJson[Foo]) { implicit request =>
val isEqual = request.body == foo
Ok(isEqual.toString)
}
def postTolerateJson = Action(circe.tolerantJson) { implicit request =>
val isEqual = request.body == foo.asJson
Ok(isEqual.toString)
}
}
FAQ
- If you want to customize the json output, you can provide an implicit
Printer
in scope (default isPrinter.noSpaces
):
import io.circe.Printer
implicit val customPrinter = Printer.spaces2.copy(dropNullValues = true)
- The
Circe
totally ignores the configuredHttpErrorHandler
and just usesDefaultHttpErrorHandler
. If this not what you want, simply make a trait to overridecirceErrorHandler
like this
class MyController @Inject() (val errorHandler: HttpErrorHandler, val controllerComponents: ControllerComponents) extends BaseController with Circe {
override def circeErrorHandler = errorHandler
}