json - Scala 2.10,它对 JSON 库和案例类验证/创建的影响

标签 json scala reflection instantiation coercion

显然,在 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 的一系列博客,因为它们非常有启发性!

最后说明

遗憾的是,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/

相关文章:

function - 如何获取用于调用 powershell 函数的原始表达式?

java getMethod() 泛型类型

actionscript-3 - ActionScript 中的 JSON : how to get the properties and values on a JSON object?

scala - 类型参数中 `::` 的含义?

c# - 反射找不到抽象类属性的私有(private) setter

scala - 如何在 scalajs-react 中使用类型参数化组件

scala - 连接 RDD 上的随机分区器行为

php - 从 mysql 编写正确的 JSON 结构

javascript - json 在 stringify 期间不包含对象名称

json - 任何人都可以对 CURIE 以及如何使用它们提供一个很好的解释吗?