Используйте Java URI для проверки URL в случае класса - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть класс дела:

case class ProfileUrl
(
  profileId : Long,
  socialUrl : String
)

implicit val profileUrlJsonFormat : Format[ProfileUrl] = Json.format[ProfileUrl]

Я хотел бы подтвердить, что socialUrl содержит действительный URL. Я думаю об использовании java.net.URL или java.net.URI. Я бы предпочел не создавать пользовательский валидатор для URL-адресов, которые мне нужно запускать каждый раз, когда я создаю экземпляр указанного класса из json. Есть ли способ, которым я могу сделать это, оборачивая URL или создавая собственный анализатор json? В любом случае, как бы я поступил так?

1 Ответ

0 голосов
/ 01 мая 2018

Можно использовать регулярное выражение URL с 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...