使用JSON4S对Scala中的案例对象进行反序列化

use*_*880 7 json scala scalatra json4s

我有一些案例类定义如下:

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)
Run Code Online (Sandbox Code Playgroud)

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

post("/dog") {
  val dog = parsedBody.extract[Dog]
  ...
}
Run Code Online (Sandbox Code Playgroud)

我想要这个JSON对象:

{
  name: "Spike",
  breed: "Mastiff"
}
Run Code Online (Sandbox Code Playgroud)

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

Yad*_*nan 8

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

串行器:

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("$",""))
    }))
Run Code Online (Sandbox Code Playgroud)

现在,您必须将此序列化程序添加到默认格式.

import org.json4s.CustomSerializer
val serializers = List(BreedSerializer)
implicit lazy val serializerFormats: Formats = DefaultFormats ++ serializers
Run Code Online (Sandbox Code Playgroud)

希望这能解决你的问题.