我定义了一些案例类,如下所示:

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

case class Dog(name: String, breed: Breed)


我也有一个用Scalatra定义的端点:

post("/dog") {
  val dog = parsedBody.extract[Dog]
  ...
}


我想要这个JSON对象:

{
  name: "Spike",
  breed: "Mastiff"
}


反序列化为Dog的适当实例。我正在努力弄清楚如何为Breed编写自定义反序列化器并将其注册到JSON4S。

最佳答案

您需要编写如下的序列化器:

序列化器:

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("$",""))
    }))


现在,您将不得不将此序列化器添加为默认格式。

import org.json4s.CustomSerializer
val serializers = List(BreedSerializer)
implicit lazy val serializerFormats: Formats = DefaultFormats ++ serializers


希望这能解决您的问题。

08-24 22:43