Scala Play 示例应用 Json 序列化程序错误
Scala Play Sample App Json Serializer errors
我正在尝试使用 Play 框架的 Scala 并拥有 10 多年的 Java/Spring 经验
下面是我正在尝试的源代码
路线文件
GET /stock controllers.HomeController.saveStock
示例模型对象
import play.api.libs.json._
case class Stock(symbol: String = "", price: Double = 0d)
object Stock {
implicit def stockReads = Json.reads[Stock]
implicit def stockWrites = Json.writes[Stock]
implicit def stockFormat = Json.format[Stock]
}
示例控制器
import models.Stock
import javax.inject._
import play.api.mvc._
import play.api.libs.json._
@Singleton
class HomeController @Inject()(cc: ControllerComponents) extends AbstractController(cc: ControllerComponents) {
def index() = Action { implicit request: Request[AnyContent] =>
Ok(views.html.index())
}
def saveStock = Action{ implicit request: Request[AnyContent] =>
var stocks = List(Stock())
println(stocks)
Ok(Json.toJson(Stock)).as("application/json")
//Ok
}
}
build.sbt
scalaVersion := "2.13.6"
libraryDependencies += guice
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "5.0.0" % Test
libraryDependencies += "com.typesafe.play" %% "play-server" % "2.8.8"
libraryDependencies += "com.typesafe.play" %% "play-slick" % "5.0.0"
libraryDependencies += "com.github.tminglei" %% "slick-pg" % "0.19.7"
libraryDependencies += "ai.x" %% "play-json-extensions" % "0.42.0"
错误 - http://localhost:9000/
未找到类型 models.Stock.type 的 Json 序列化程序。尝试为此类型实现隐式写入或格式。
在错误消息“No Json serializer found for type models.Stock.type
” 中,需要注意的一件重要事情是 .type
后缀.
指的是object Stock
,不是case class
。那就是错误说“我不知道如何序列化 object Stock
”。
这是因为您写的是 Json.toJson(Stock)
而不是 Json.toJson(Stock())
或者您的意思是 Json.toJson(stocks)
.
Stock
指的是 object
而 Stock()
是实例化 case class
.
还有:
- 如果在结果中使用
JsObject
,则无需指定 as(...)
。
- 你不需要
Reads
也不需要 Writes
如果你提供 Format
(后者提供 2 个前者)
- 使用
val
而不是var
(不变性是Scala的强项)
我正在尝试使用 Play 框架的 Scala 并拥有 10 多年的 Java/Spring 经验
下面是我正在尝试的源代码
路线文件
GET /stock controllers.HomeController.saveStock
示例模型对象
import play.api.libs.json._
case class Stock(symbol: String = "", price: Double = 0d)
object Stock {
implicit def stockReads = Json.reads[Stock]
implicit def stockWrites = Json.writes[Stock]
implicit def stockFormat = Json.format[Stock]
}
示例控制器
import models.Stock
import javax.inject._
import play.api.mvc._
import play.api.libs.json._
@Singleton
class HomeController @Inject()(cc: ControllerComponents) extends AbstractController(cc: ControllerComponents) {
def index() = Action { implicit request: Request[AnyContent] =>
Ok(views.html.index())
}
def saveStock = Action{ implicit request: Request[AnyContent] =>
var stocks = List(Stock())
println(stocks)
Ok(Json.toJson(Stock)).as("application/json")
//Ok
}
}
build.sbt
scalaVersion := "2.13.6"
libraryDependencies += guice
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "5.0.0" % Test
libraryDependencies += "com.typesafe.play" %% "play-server" % "2.8.8"
libraryDependencies += "com.typesafe.play" %% "play-slick" % "5.0.0"
libraryDependencies += "com.github.tminglei" %% "slick-pg" % "0.19.7"
libraryDependencies += "ai.x" %% "play-json-extensions" % "0.42.0"
错误 - http://localhost:9000/ 未找到类型 models.Stock.type 的 Json 序列化程序。尝试为此类型实现隐式写入或格式。
在错误消息“No Json serializer found for type models.Stock.type
” 中,需要注意的一件重要事情是 .type
后缀.
指的是object Stock
,不是case class
。那就是错误说“我不知道如何序列化 object Stock
”。
这是因为您写的是 Json.toJson(Stock)
而不是 Json.toJson(Stock())
或者您的意思是 Json.toJson(stocks)
.
Stock
指的是 object
而 Stock()
是实例化 case class
.
还有:
- 如果在结果中使用
JsObject
,则无需指定as(...)
。 - 你不需要
Reads
也不需要Writes
如果你提供Format
(后者提供 2 个前者) - 使用
val
而不是var
(不变性是Scala的强项)