前言
让我给出一种不同的解决方案,它不依赖于任何基于 Java 的库,而只依赖于纯 Scala 库。
实际上,正如 @Steve 结果评论中所讨论的,Play 2 的 scala 版本使用 Jerkson 将 Json 反/序列化为域模型。 Jerkson 是一个用于处理 Json 的非常好的 Java 库的 DSL 包装器。
Answer
上面没有回答你的问题,因为你问是否已经设想使用 Scala 2.10 的反射和宏功能来简化这项任务!通过消除大多数样板文件。
事实上这是一个非常好的想法,因为从 Play 2.1 版本开始,Json Scala API 不再使用 Jerkson,而是使用自己的机制。
该机制实际上是通过引入基于以下两点的全新 API 来利用 Scala 新 2.10 版本的优势:
- 适合能够读取和写入 Json 或域实例的功能结构(Applicative Builder)。这些构建器用于粘合组合器(用于读取或写入),以定义粗粒度结构(就像我们对解析器组合器所做的那样)
- 一堆宏,能够发现哪些组合器隐式可用,并为它们构造复杂的组合器案例类别(或者至少具有以下类型
apply
and unapply
方法)。
归根结底,我们可以使用此 API 执行以下操作:
import play.api.libs.json._
import play.api.libs.functional.syntax._
case class Person(name: String, age: Int, lovesChocolate: Boolean)
implicit val personReads = Json.format[Person] //a format is a Reader and a Writer
//this format will be implicitly used by the following from/toJson functions
val person:JsResult[Person] = Json.fromJson(json) //JsResult is like JsSucces/JsError
val jsObject = Json.toJson(person)
代码复制并改编自:JSON Inception(基于 Scala 2.10 宏) http://mandubian.com/2012/11/11/JSON-inception/
一点注意:新的 API 甚至足够智能,能够通过累积错误来验证“读取”......
参考
我在这里推荐 @mandubian 的一系列博客,因为它们非常有启发性!
- JsPath 和读取组合器:http://mandubian.com/2012/09/08/unveiling-play-2-dot-1-json-api-part1-jspath-reads-combinators/ http://mandubian.com/2012/09/08/unveiling-play-2-dot-1-json-api-part1-jspath-reads-combinators/
- 写入/格式组合器:http://mandubian.com/2012/10/01/unveiling-play-2-dot-1-json-api-part2-writes-format-combinators/ http://mandubian.com/2012/10/01/unveiling-play-2-dot-1-json-api-part2-writes-format-combinators/
- JSON 转换器:http://mandubian.com/2012/10/29/unveiling-play-2-dot-1-json-api-part3-json-transformers/ http://mandubian.com/2012/10/29/unveiling-play-2-dot-1-json-api-part3-json-transformers/
- JSON Inception(基于 Scala 2.10 宏):http://mandubian.com/2012/11/11/JSON-inception/ http://mandubian.com/2012/11/11/JSON-inception/
最后说明
可悲的是,Play 2 的模块化...不允许我们单独使用这个 API!因此,它应该从整个播放库中使用:/
这在未来可能会改变......
EDIT
未来已经越来越近了,因为帕斯卡有这个repo https://github.com/mandubian/play-json-alone使我们能够使用 play-json API。
因此,在 Play 2.2 发布之前可以使用此存储库。事实上,这个版本将与 json 或 iteratees 等几个 API 完全解耦,因此,我们将能够直接使用 playframework 存储库。