Scala 2.10及其对JSON库和案例类验证/创建的影响

在Scala 2.10中,显然我们得到了改进的反射

这将如何影响json、杰克森、sjson和朋友?此外,在不远的将来,我们能期待一个内置的JSON语言特性,一个la Groovy在Scala中的优秀GSON吗

我问的原因是我非常喜欢做:

案例类Foo(a:String,b:Int,bar:bar)
案例类别栏(c:Int)
val foo=foo(“嘿,10,Bar(23))
val json=foo.toJson

即使使用任意复杂的对象图,也无需跳转(即样板准备工作)。也许我要求的太多了,但人们总是可以梦想。请粉碎我的2.10梦想,或者告诉我,随着备受期待的Scala的发布,有哪些新的途径正在打开

另外,对于案例类,似乎对于验证/创建来说,scalaz验证是首选的武器。作为对象创建的安全代理或错误收集器,它看起来非常棒。然而,作为一名Scewbie,我觉得scalaz有点挑战性,尽管它有着明显的力量,但我抵制着F-ing的黑暗面;-)

无论如何,这里的要点是,使用2.10反射,我们应该能够在运行时将字段(例如,表单post)绑定到案例类的属性,并仅基于属性类型执行基本验证(也就是说,不必指定单独的验证逻辑来指定属性foo必须是字符串,因为它的类型已经在case类中定义,我们现在可以正确地反映该类)

那么,勇敢的新世界即将到来,还是现有的工具是可预见未来的支柱

前言

让我给出一个不同的解决方案,它不依赖于任何基于Java的库,而只依赖于纯Scala库

事实上,正如@Steve的results Play 2的scala版本的评论中所讨论的,它使用Jerkson将Json反序列化到域模型。其中,Jerkson是一个DSL包装器,它围绕着一个非常好的Java库来处理Json

答复

上面的内容并没有回答您的问题,因为您在问,是否设想使用Scala 2.10的反射和宏功能来简化此任务!!!!通过删除大多数样板文件

事实上,这是一个非常好的想法,因为从Play 2.1版本来看,Json Scala API不再使用Jerkson,而是使用它自己的机制

事实上,这种机制利用了Scala的新2.10版本,引入了基于以下两个方面的全新API:

  • 一种功能结构(应用程序构建器),适合于读取和写入Json或域实例。这些构建器用于粘合所有组合器(用于读取或写入),以便定义粗粒度结构(就像我们使用解析器组合器一样)
  • 一组宏,能够发现哪些组合符隐式可用,并将为案例类构造复杂的组合符(或至少具有应用不应用方法的类型)

最后,我们可以通过使用此API来实现以下功能:

导入play.api.libs.json_
导入play.api.libs.functional.syntax_
case类Person(名称:String,年龄:Int,lovesChocolate:Boolean)
隐式val personReads=Json.format[Person]//格式是读写器
//此格式将由以下from/toJson函数隐式使用
val person:JsResult[person]=Json.fromJson(Json)//JsResult类似于JsSucces/JsError
val jsObject=Json.toJson(个人)

代码复制和改编自:JSON Inception(基于Scala 2.10宏)

需要注意的是:新的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初始版本(基于Scala 2.10宏):http://mandubian.com/2012/11/11/JSON-inception/

最后说明

遗憾的是,Play 2的模块化…不允许我们单独使用此API!因此,应从Play库整体使用它:/
这在将来可能会改变

编辑

未来越来越近了,因为Pascal有了这个repo,使我们能够使用play json API

因此,在Play2.2发布之前,我们可以使用这个repo。实际上,这个版本将与几个API(如json或iteratees)完全解耦,因此,我们将能够直接使用playframework repo

发表评论