Deserialization of case object in Scala with JSON4S
You need to write the serializer like below:
Serializer:
case object BreedSerializer extends CustomSerializer[Breed](format => ( { case JString(breed) => breed match { case "Beagle" => Beagle case "Mastiff" => Mastiff case "Yorkie" => Yorkie } case JNull => null }, { case breed:Breed => JString(breed.getClass.getSimpleName.replace("$","")) }))
Now, you will have to add this serialiser to the default formats.
import org.json4s.CustomSerializerval serializers = List(BreedSerializer)implicit lazy val serializerFormats: Formats = DefaultFormats ++ serializers
Hope this solves your problem.
You can create a CustomSerializer
for Breed
like you mentioned :
import org.json4s._import org.json4s.JsonDSL._import org.json4s.native.JsonMethods._import org.json4s.native.Serializationimport org.json4s.native.Serialization._object BreedSerializer extends CustomSerializer[Breed]( format => ( { case JString("Beagle") => Beagle case JString("Mastiff") => Mastiff case JString("Yorkie") => Yorkie }, { case Beagle => JString("Beagle") case Mastiff => JString("Mastiff") case Yorkie => JString("Yorkie") } ))
Which you can use as :
val json1 = """{ "name": "Spike", "breed": "Yorkie" }"""val json2 = """{ "name": "Pluto", "breed": "Mastiff" }"""implicit val json4sFormats = Serialization.formats(NoTypeHints) + BreedSerializerval dog1 = parse(json1).extract[Dog] // Dog(Spike,Yorkie)val dog2 = parse(json2).extract[Dog] // Dog(Pluto,Mastiff)