加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:47:55 所属栏目:安全 来源:网络整理
导读:在Scala 2.10中,显然我们得到了改进的反射。 这将如何影响json,jerkson,sjson和朋友?此外,我们可以期望在不太遥远的未来一个内置的JSON语言特性一个la Groovy的优秀GSON在Scala? 我问的原因是,我真的很愿意做: case class Foo(a: String,b: Int,bar:
在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所做的那样)
>一堆宏,它们能够发现哪些组合器是隐式可用的,并且将为Case类(或至少具有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: 07000

注意:新的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 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/

最后注意

令人遗憾的是,Play 2的模块化不允许我们单独使用这个API!所以,它应该从播放lib作为一个整体使用:
这可能会在将来更改…

编辑

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

所以,可以使用这个repo,直到Play 2.2将被释放。事实上,这个版本将与几个API(如json或iteratees)完全解耦,因此,我们将能够直接使用playframework repo。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读