我有一个案例类:
case class ProfileUrl
(
profileId : Long,
socialUrl : String
)
implicit val profileUrlJsonFormat : Format[ProfileUrl] = Json.format[ProfileUrl]
我想验证socialUrl
是否包含有效的网址。我正在考虑使用java.net.URL
或java.net.URI
。我宁愿不为我需要在我从json实例化所述类时运行的URL创建自定义验证器。有没有办法通过包装URL或创建自定义json解析器来做到这一点?无论哪种方式,我将如何做这样的事情?
答案 0 :(得分:0)
一个选项是使用URL regular expression和Reads.pattern
来定义socialUrl
字符串值的正则表达式约束,如下所示:
import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.functional.syntax._
case class ProfileUrl(
profileId : Long,
socialUrl : String
)
object ProfileUrl {
val urlRegex =
"""((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)""".r
implicit val profileUrlReads: Reads[ProfileUrl] = (
(JsPath \ "profileId").read[Long] and
(JsPath \ "socialUrl").read[String](pattern(urlRegex, "Malformed URL"))
)(ProfileUrl.apply _)
}
object UrlJsonValidationExample extends App {
val str = """{"profileId": 123, "socialUrl": "www.example.com"}"""
val json = Json.parse(str)
val profileUrl = json.as[ProfileUrl]
println(profileUrl)
}