2

我遇到过这篇文章,它演示了新的播放验证 API 与 shapeless 的结合。我无法重新创建代码片段(可能是因为我不知道从哪里导入)。

import play.api.libs.json._
import play.api.data.mapping._
import play.api.data.mapping.json._
import shapeless.ops.zipper._

case class User( email: String, password: String )

val reads = Rule.gen[JsValue, User]

// This line is based on code of the article but I'm not sure how to implement it
val validation = Get{ __ =>
  ( __ \ 'email ).read( email )
}

( reads compose validation ).validate( ... )

如何正确创建Get实例?正如文章所暗示的,这种方法与无形镜片有什么关系?

4

1 回答 1

4

我是博文的作者。这是我刚刚编写的完整代码。您将需要验证实验,以便您可以将 repo 和 sbt 控制台克隆到项目中,或者将依赖项添加到您的项目中。我前段时间写了这个,所以它依赖于一个相当旧的无形版本。

import play.api.data.mapping._
import shapeless._

case class ContactInformation(
  label: String,
  email: String,
  phones: Seq[String])

case class Contact(
  firstname: String,
  lastname: String,
  age: Int,
  informations: Seq[ContactInformation])

object Rules extends GenericRules
import Rules._

val contactInfoG = Get[ContactInformation]{ __ =>
  (__ \ 'label).read(notEmpty) ~>
  (__ \ 'email).read(email)
}

val contactG = Get[Contact]{ __ =>
  (__ \ 'age).read(min(0)) ~>
  (__ \ 'informations).read(seqR(contactInfoG))
}

val contact = Contact("Julien", "Tournay", -1, Seq(ContactInformation("Personal", "not quite what I expected", List("01.23.45.67.89", "98.76.54.32.10"))))
contactG.validate(contact)

与镜头的关系如下。验证旨在使用像 json 或 xml 这样的树状数据结构。它以路径的概念为中心。基本上,如果可以通过路径浏览,该 API 适用于任何数据结构。即给定路径(__\'age),就可以在这个位置获取/插入数据。

Lens 为您提供了一个方便的 API 来处理案例类。所以在幕后, (__ \ 'age).read(min(0)) 将使用镜头来访问 Contact 类中的字段年龄(并且它是完全类型安全的)。

我没有太多时间知道所以不要犹豫问问题,我会回答一会儿:)

于 2015-07-16T09:52:27.823 回答