3

我正在为我的案例对象使用我自己的 JSON 序列化器和反序列化器的隐式实现

我的案例类看起来像(它只是一个代码片段)

sealed trait MyTrait

case object MyCaseClass extends MyTrait

我想写我自己的ser。和沙漠。用于 MyTrait 的 JSON

implicit val myTraitFormat = new JsonFormat[MyTrait] {
  override def read(json: JsValue): MyTrait = json.asJsObject.getFields("value") match {
    case Seq(JsString("TEST")) ⇒ MyCaseClass
    case _ ⇒ throw new DeserializationException(s"$json is not a valid extension of my trait")
  }
  override def write(myTrait: MyTrait): JsValue = {
    myTrait match {
      case MyCaseClass => JsObject("value" -> JsString("TEST"))
    }
  }
}

现在我的测试因抛出 DeserializationException 而失败:

"The my JSON format" when {
  "deserializing a JSON" must {
    "return correct object" in {
      val json = """{"value": "TEST"}""".asJson
      json.convertTo[MyTrait] must equal (MyCaseClass)
    }
  }
}

显然json.asJsObject.getFields("value")无法匹配到Seq(JsString("TEST"))。也许这与使用特征有关?但我在官方 spray-json 网站https://github.com/spray/spray-json#providing-jsonformats-for-other-types上找到了示例

任何想法如何正确匹配 JsObject 中的字段?

谢谢!最好的

4

1 回答 1

0

写变量名而不是字符串:

  override def read(json: JsValue): MyCaseClass = json.asJsObject.getFields("value") match {
    case Seq(JsString(value)) ⇒ MyCaseClass
    case _ ⇒ throw new DeserializationException(s"$json is not a valid case class")
  }

那对你有用吗?

更新:是的,你的测试是错误的。我尝试了以下方法(注意 parseJson 而不是 asJson)并且它有效:

scala> val json = """{"value": "TEST"}""".parseJson
json: spray.json.JsValue = {"value":"TEST"}

scala> json.convertTo[MyCaseClass]
res2: MyCaseClass = MyCaseClass()

更新 2: 尝试了 trait:

scala> import spray.json._
import spray.json._

scala> import spray.json.DefaultJsonProtocol._
import spray.json.DefaultJsonProtocol._

[Your code]

scala> val json = """{"value": "TEST"}""".parseJson
json: spray.json.JsValue = {"value":"TEST"}

scala> json.convertTo[MyTrait]
res1: MyTrait = MyCaseClass
于 2014-06-06T12:04:02.197 回答