Deserialization of case object in Scala with JSON4S Deserialization of case object in Scala with JSON4S json json

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)