【问题标题】:spray.json.DeserializationException: Expected String as JsString, but got {}spray.json.DeserializationException:预期字符串为 JsString,但得到了 {}
【发布时间】:2022-12-17 21:59:24
【问题描述】:

我正在为我的对象使用 Either 实现,因为我希望对象中的一个参数有一个空的 Json。这是对象:

case class Record(id: String, version: Long, payload: Either[PayloadObject, String]))

我正在尝试对此发送一个空的 json 字符串进行单元测试,如下所示:

val jsonString = """
     | {
     |   "id":"someId"
     |   "version":123456
     |   "payload":{}
     | }
|""".stripMargin

这是我反序列化上述 json 字符串的单元测试:

{
val deserialized = Record("someId", 123456L, Right(""))
val result = jsonString.convertTo[Record]
result must equal(deserialized)
}

这是抛出错误。 spray.json.DeserializationException:预期字符串为 JsString,但得到了 {}。如何将变量 serialized 表示为空 JsString 以运行单元测试?谢谢

【问题讨论】:

  • 你的进口商品是什么?
  • 旁注:JSON 是序列化形式。您在这里测试反序列化:将 JSON 转换为案例类。
  • 更新了问题。导入是 spray.json._ 用于序列化-反序列化

标签: scala spray spray-json either


【解决方案1】:

如果我正确理解你的问题,你需要为你的案例类定义一个自定义格式。

case class Record(id: String, version: Long, payload: Either[JsObject, String])

object Record {

  implicit val recordFormat: RootJsonReader[Record] = (json: JsValue) =>
    json.asJsObject.getFields("id", "version", "payload") match {
      case Seq(JsString(id), JsNumber(version), JsObject.empty)    => Record(id, version.toLong, Right(""))
      case Seq(JsString(id), JsNumber(version), payload: JsObject) => Record(id, version.toLong, Left(payload))
      case _                                                       => throw new Exception("Invalid record")
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2015-07-05
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多