所以我有以下代码:
基地:
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)没有正确检测到类的原因可能是什么?
答案 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的编译器错误。