我定义了一些案例类,如下所示:
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。
Dog
Breed
您需要编写如下的序列化器:
序列化器 :
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
希望这能解决您的问题。