gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:43:12 25 4
gpt4 key购买 nike

所以我有以下代码:

基础:

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)
)
}
}
}

编译器错误如下:

type mismatch;
[error] found : Object
[error] required: play.api.libs.json.Json.JsValueWrapper
[error] "cost" -> r.cost.map(Json.toJson(_)).getOrElse(JsNull)

在后者中,如果我使用 .asInstanceOf[JsValue] 它可以工作,但是 IntelliJ 将其灰显,表示这是不必要的,因为无论如何它都不能是 JsValue 之外的任何东西。 Scala 编译器(2.11.7)无法正确检测类的原因可能是什么?

最佳答案

我很确定问题来自 .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
)

如果您想使用 getOrElse 解析 cost 值的 Option,您可以强制转换(正如您尝试过的那样)或提供类型:

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 的编译器错误。

关于json - Scala 编译器 (2.11.7) 与 Play JSON 写入异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39660655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com