显然,在 Scala 2.10 中,我们正在改进反射。
这将如何影响lift-json、jerkson、sjson 和 friend ?此外,我们是否可以期待在不久的将来,内置 JSON 语言的功能就像 Groovy 在 Scala 中的出色 GSON?
我问的原因是我非常愿意这样做:
case class Foo(a: String, b: Int, bar: Bar)
case class Bar(c: Int)
val foo = Foo("hey", 10, Bar(23))
val json = foo.toJson
没有箍跳(即样板式的准备工作),即使是任意复杂的对象图。也许我问的太多了,但一个人总是可以梦想的。请粉碎我的 2.10 梦想,或者告诉我随着备受期待的 Scala 版本开辟了哪些新途径。下一个
此外,关于案例类,似乎用于验证/创建,scalaz 验证是首选武器。作为对象创建的安全代理或错误收集器,这看起来非常棒。然而,作为一个 Scewbie,我发现 scalaz 有点挑战性,尽管它的力量很明显,我还是在抵制 F-ing 黑暗面 ;-)
无论如何,这里的重点是,通过 2.10 反射,我们应该能够在运行时将表单帖子中的字段绑定(bind)到案例类的属性,并仅基于属性类型执行基本验证(即不必指定单独的验证逻辑来指定属性 foo 必须是一个字符串,因为它的类型已经在我们现在可以正确反射(reflect)的案例类中定义)
那么,勇敢的新世界来了,还是现有工具是可预见的 future 的支柱?
最佳答案
前言
让我给出一个不同的解决方案,它不依赖于任何基于 Java 的库,而只依赖于一个纯 Scala 库。
实际上,正如@Steve 的结果评论中所讨论的,Play 2 的 scala 版本正在使用 Jerkson 将 Json 反序列化为域模型。 Jerkson 是一个 DSL 包装器,它围绕一个非常好的 Java 库来处理 Json。
回答
上面没有回答你的问题,因为你问的是是否已经设想使用 Scala 2.10 的反射和宏特性来简化这个任务!!!!通过消除大多数样板。
事实上这是一个非常好的想法,因为从 Play 2.1 版本开始,Json Scala API 不再使用 Jerkson,而是使用了自己的机制。
这种机制实际上是利用了这个新的 Scala 2.10 版本,引入了一个基于两个方面的全新 API:
- 适用于能够读写 Json 或 Domain 实例的功能构造 (Applicative Builder)。这些构建器用于粘合所有组合器(用于读取或写入),以定义粗粒度结构(就像我们使用 Parser Combinators 所做的那样)
- 一组宏,它们能够发现哪些组合子是隐式可用的,并将为 Case Classes(或至少具有
apply
和的类型构建复杂的组合子>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)
code copied and adapted from: JSON Inception (Based on Scala 2.10 Macros)
一点提示:新的 API 甚至足够智能,可以通过累积错误来验证“读取”...
引用文献
我会从这里推荐来自@mandubian 的一系列博客,因为它们非常有启发性!
- JsPath 和读取组合器: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/
- JSON 转换器: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/
最后说明
遗憾的是,Play 2 的模块化......不允许我们单独使用这个 API!因此,它应该从整个 play 库中使用:/ 这可能会在未来改变......
编辑
现在离 future 越来越近了,因为帕斯卡有这个repo使我们能够使用 play-json API。
因此,在 Play 2.2 发布之前,您可以使用此存储库。事实上,这个版本将与几个 API 完全解耦,例如 json 或 iteratees,因此,我们将能够直接使用 playframework repo。
关于json - Scala 2.10,它对 JSON 库和案例类验证/创建的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9610103/