简体   繁体   English

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

[英]Deserialization of case object in Scala with JSON4S

I have some case classes defined like follows: 我有一些案例类定义如下:

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)

I also have an endpoint defined with Scalatra: 我还有一个使用Scalatra定义的端点:

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

I'd like this JSON object: 我想要这个JSON对象:

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

to deserialize to the appropriate instance of Dog . 反序列化为适当的Dog实例。 I'm struggling to figure out how to write a custom deserializer for Breed and register it with JSON4S. 我正在努力弄清楚如何为Breed编写自定义反序列化器并将其注册到JSON4S。

You need to write the serializer like below: 您需要编写如下的序列化程序:

Serializer : 串行器

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

Now, you will have to add this serialiser to the default formats. 现在,您必须将此序列化程序添加到默认格式。

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

Hope this solves your problem. 希望这能解决你的问题。

You can create a CustomSerializer for Breed like you mentioned : 你可以像你提到的那样为Breed创建一个CustomSerializer

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM