Deserialization of case object in Scala with JSON4S

后端 未结 2 528
谎友^
谎友^ 2020-12-19 02:55

I have some case classes defined like follows:

sealed trait Breed
case object Beagle extends Breed
case object Mastiff extends Breed
case object Yorkie exten         


        
相关标签:
2条回答
  • 2020-12-19 03:25

    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.CustomSerializer
    val serializers = List(BreedSerializer)
    implicit lazy val serializerFormats: Formats = DefaultFormats ++ serializers
    

    Hope this solves your problem.

    0 讨论(0)
  • 2020-12-19 03:31

    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.Serialization
    import 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) + BreedSerializer
    
    val dog1 = parse(json1).extract[Dog] // Dog(Spike,Yorkie)
    val dog2 = parse(json2).extract[Dog] // Dog(Pluto,Mastiff)
    
    0 讨论(0)
提交回复
热议问题