Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用JSON4S反序列化Scala中的case对象_Json_Scala_Scalatra_Json4s - Fatal编程技术网

用JSON4S反序列化Scala中的case对象

用JSON4S反序列化Scala中的case对象,json,scala,scalatra,json4s,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) 我还使用Scalatra定义了一个端点: post("/dog") { val dog = parsedBody.extract[Dog]

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

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"
}

要反序列化到
狗的相应实例
。我正在努力弄清楚如何为
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

希望这能解决您的问题。

您可以为
品种
创建一个
自定义序列化程序
,如您所述:

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")
  }  
))
您可以将其用作:

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)