一尘不染

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

json

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

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。


阅读 415

收藏
2020-07-27

共1个答案

一尘不染

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

序列化器

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

希望这能解决您的问题。

2020-07-27