Scala编译器(2.11.7)与Play JSON写入异常

时间:2016-09-23 12:21:20

标签: json scala playframework scala-2.11

所以我有以下代码:

基地:

    apply<uint8_t>(1.0f);

编译:

import play.api.libs.json.{JsNull, Json, JsValue, Writes}
case class Cost(cost: Option[Double])

但这并没有编译

case object Cost {
  def writes = new Writes[Cost] {
    override def writes(r: Cost): JsValue = {
      val cost = r.cost.map(Json.toJson(_)).getOrElse(JsNull)
      Json.obj(
        "cost" -> cost
      )
    }
  }
}

编译器错误如下:

case object Cost {
  def writes = new Writes[Cost] {
    override def writes(r: Cost): JsValue = {
      Json.obj(
        "cost" -> r.cost.map(Json.toJson(_)).getOrElse(JsNull)
      )
    }
  }
}

在后者中如果我使用.asInstanceOf [JsValue]它可以工作,但IntelliJ会说它不必要,因为它无论如何都不能成为JsValue。 Scala编译器(2.11.7)没有正确检测到类的原因可能是什么?

1 个答案:

答案 0 :(得分:2)

我很确定问题来自.getOrElse(JsNull)

我已经成功编译了这段代码:

import play.api.libs.json.{JsNull, Json, JsValue, Writes}

case class Cost(cost: Option[Double])

case object Cost {
  def writes = new Writes[Cost] {
    override def writes(r: Cost): JsValue = {
      Json.obj(
        "cost" -> r.cost.map(Json.toJson(_))
      )
    }
  }
}

并解析输出:

scala> Cost(Some(5))
res2: Cost = Cost(Some(5.0))

scala> Json.toJson(res2)(Cost.writes)
res5: play.api.libs.json.JsValue = {"cost":5}

在寻找问题的根源时,您可以检查其他几个解决方案,假设写入功能:

val cost = r.cost.map(t => Json.toJson(t))
Json.obj(
  "cost" -> cost
)

如果您要使用Option解析cost getOrElse值,您可以投票(如您所尝试)或提供类型:

cost.getOrElse[JsValue](JsNull)
cost.getOrElse(JsNull).asInstanceOf[JsValue]

且没有类型说明sbt总是会出错:

[error] (...) type mismatch;
[error]  found   : Object
[error]  required: play.api.libs.json.Json.JsValueWrapper

必须来自某些SBT的编译器错误。