I need to get a simple JSON serialization solution with minimum ceremony. So I was quite happy finding this forthcoming Play 2.2 library. This works perfectly with plain case classes, e.g.
import play.api.libs.json._
sealed trait Foo
case class Bar(i: Int) extends Foo
case class Baz(f: Float) extends Foo
implicit val barFmt = Json.format[Bar]
implicit val bazFmt = Json.format[Baz]
But the following fails:
implicit val fooFmt = Json.format[Foo] // "No unapply function found"
How would I set up the alleged missing extractor for Foo
?
Or would you recommend any other standalone library that handles my case more or less fully automatically? I don't care whether that is with macros at compile time or reflection at runtime, as long as it works out of the box.
A small fix for the previous answer by 0__ regarding the direct format definition - the reads method didn't work, and here is my refactor to it, to also become more idiomatic -
Play 2.6
This can be done now elegantly with play-json-derived-codecs
Just add this:
See here for the whole example: ScalaFiddle
AMENDED 2015-09-22
The library play-json-extra includes the play-json-variants strategy, but also the [play-json-extensions] strategy (flat string for case objects mixed with objects for case classes no extra $variant or $type unless needed). It also provides serializers and deserializers for macramé based enums.
Previous answer There is now a library called play-json-variants which allows you to write :
This will generate the corresponding formats automatically, it will also handle disambiguation of the following case by adding a $variant attribute (the equivalent of 0__ 's
class
attribute)would generate
Here is a manual implementation of the
Foo
companion object:Verification:
Alternatively the direct format definition:
Now ideally I would like to automatically generate the
apply
andunapply
methods. It seems I will need to use either reflection or dive into macros.