Scala 2.10,它对JSON库和案例类验证/创建的影响
在Scala 2.10中,显然我们得到了改进的反射。
这将如何影响json,jerkson,sjson和朋友?此外,我们可以期望在不太遥远的未来一个内置的JSON语言特性一个la Groovy的优秀GSON在Scala? 我问的原因是,我真的很愿意做: 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.Next 此外,对于case类,似乎为验证/创建,scalaz验证是最好的选择武器。它似乎相当精彩,作为一个安全代理对象创建或作为一个错误收集器。然而,作为一个Scewbie,我发现scalaz有点具有挑战性,并且抵抗Fing黑暗的一面尽管它明显的力量;-) 无论如何,这里的要点是,使用2.10反射,我们应该能够在运行时绑定从说,一个表单post到一个case类的属性的字段,并且基于属性类型单独执行基本验证(即不会有指定单独的验证逻辑,指定属性foo必须是一个字符串,因为它的类型已经在case类中定义,我们现在可以正确反映) 所以,勇敢的新世界来了,或者现有的工具是可预见的未来的支柱? 解决方法
前言
让我给出一个不依赖于任何基于Java的库但只有一个纯Scala的不同的解决方案。 实际上,正如在@ Steve的结果的评论中所讨论的,Play 2的scala版本使用Jerkson将Json序列化为域模型。其中Jerkson是一个围绕着一个非常好的Java库来处理Json的DSL包装器。 回答 上面没有回答你的问题,因为你问是否已经设想使用反射和Scala 2.10的宏功能来缓解这个任务!通过消除大多数锅炉。 这是一个很好的想法,事实上,因为从Play 2.1版本,Json Scala API不再使用Jerkson,但它是自己的机制。 这个机制实际上利用这个新的2.10版本的Scala,通过引入一个基于两件事的全新的API: >适用于能够读取和写入Json或域实例的功能构造(应用构造器)。这些构建器用于粘合整个组合器(用于读或写),以便定义粗粒结构化(如我们对Parser Combinator所做的那样) 在一天的结束,这里是我们可以通过使用此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)
注意:新的API甚至足够聪明,能够通过累积错误来验证“读取”… 参考文献 有一系列从@mandubian的博客,我建议从这里,因为他们是非常有启发性的! > JsPath&阅读组合:http://mandubian.com/2012/09/08/unveiling-play-2-dot-1-json-api-part1-jspath-reads-combinators/ 最后注意 令人遗憾的是,Play 2的模块化不允许我们单独使用这个API!所以,它应该从播放lib作为一个整体使用: 编辑 现在,未来会越来越近,因为Pascal有了这个repo,使我们能够使用play-json API。 所以,可以使用这个repo,直到Play 2.2将被释放。事实上,这个版本将与几个API(如json或iteratees)完全解耦,因此,我们将能够直接使用playframework repo。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |