【问题标题】:Scala (spray) json serialization and deserialization issueScala (spray) json 序列化和反序列化问题
【发布时间】:2014-06-06 11:12:02
【问题描述】:

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

我的案例类看起来像(它只是一个代码 sn-p)

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 中的字段?

谢谢! 最好的

【问题讨论】:

  • 我不明白:您的测试测试序列化,但您实现了反序列化(= 读取方法)?
  • 抱歉代码有错误...你是对的...已修复!

标签: json scala serialization spray-json


【解决方案1】:

写变量名而不是字符串:

  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

【讨论】:

  • 不。还是同样的问题。如果我再做一个case a => println(a)... 在我的输出中我得到ArrayBuffer("TEST") 也许我的测试有问题
  • 这仍然不适合我。我使用 trait 扩展了示例(就像我在实际用例中所做的那样)
猜你喜欢
  • 2012-09-17
  • 2014-03-08
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 2011-04-05
  • 2023-03-10
相关资源
最近更新 更多