Deserialization of case object in Scala with JSON4S

后端 未结 2 541
谎友^
谎友^ 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: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)
    

提交回复
热议问题