Son*_*123 3 json scala playframework playframework-2.0 playframework-2.1
我是一名游戏初学者,并尝试将我的Web应用程序从Play 2.0.4迁移到新的闪亮的Play 2.1-RC2.由于新的JSON处理,我的代码无法编译.
我已阅读Mandubians博客,Play 2.1迁移指南和Play JSON库文档(测试版),但我仍然不确定迁移代码的最佳方法是什么.
F.ex. 我有一个File带有隐式读对象(Play 2.0)的模型:
object File {
implicit object FileReads extends Reads[File] {
def reads(json: JsValue) = File(
(json \ "name").as[String],
(json \ "size").as[Long]
)
}
}
Run Code Online (Sandbox Code Playgroud)
我在控制器中使用它(Play 2.0):
val file = webserviceResult.json.as[models.File]
Run Code Online (Sandbox Code Playgroud)
Play 2.1 Migration指南告诉我用这样的方法重构它JsSuccess()(Play 2.1?):
object File {
implicit object FileFormat extends Format[File] {
def reads(json: JsValue) = JsSuccess(File(
(json \ "name").as[String],
(json \ "size").as[Long]
))
}
}
Run Code Online (Sandbox Code Playgroud)
但是我现在如何使用这种隐式转换呢?
或者,在Play for Scala-bookimplicit val的Twitter示例中使用-stuff 更好?什么是将JsValue转换为Scala值的最佳方法?
或者使用像Play for Scala-book的Twitter示例中那样的隐式val-stuff更好?
是的,对于经典转换,它是一个很好的解决方案(简单而简洁).
但是有一种更简单的方法可以通过" Json Macro Inception " 实现这种转换:
import play.api.libs.json._
import play.api.libs.functional.syntax._
case class File(name: String, size: Long)
implicit val fileFormat = Json.format[File]
val json = Json.parse("""{"name":"myfile.avi", "size":12345}""") // Your WS result
scala> json.as[File]
res2: File = File(myfile.avi,12345)
Run Code Online (Sandbox Code Playgroud)
警告:您不能将您的编码器放在随播对象中,这是当前Json API的限制.
我建议使用所有json格式化程序的对象,并在必要时导入它.
仅供参考,原始形成器应该这样写:
implicit val rawFileRead: Format[File] = (
(__ \ "name").format[String] and
(__ \ "size").format[Long]
)(File.apply _, unlift(File.unapply _)) // or (File, unlift(File.unapply))
Run Code Online (Sandbox Code Playgroud)
检查这两个测试类,有很多有趣的例子: