Scala json 验证一个包含 URI 的字符串

Scala json validator a string that contain URI

我正在尝试使用这篇文章来实现验证 ScalaJsonCombinators

基本上我想获取值,如果存在,如果不存在,则 return null

val nextPage: JsResult[JsValue] = (ch.\("paging").\("next")).validate[JsValue]

    val nextUrl: String = nextPage match {
      case s: JsSuccess[String] => s.get
      case e: JsError => null
    }

我有两个问题

  1. 第一个是警告

     Warning:(99, 19) non-variable type argument String in type pattern play.api.libs.json.JsSuccess[String] is unchecked since it is eliminated by erasure
      case s: JsSuccess[String] => s.get
          ^
    
  2. 第二个是错误的,因为字符串是一个特殊的URI 字符我收到方案错误

    val nextPage: JsResult[JsValue] = (ch.("paging").("next")).validate[JsValue]

    val nextUrl: String = nextPage match {
      case s: JsSuccess[String] => s.toString
      case e: JsError => null
    }  
     java.lang.IllegalArgumentException: Illegal character in scheme name at index 9:  JsSuccess(https://graph.facebook.com/v2.2/396697410351933/feed?limit=200&access_token=623501864400497%7CGumAg3k6Eu
    

在不使用序列化的情况下验证此元素的正确方法是什么??

谢谢,

三木

  1. 您验证不正确。在 JsValue 上调用 validate[JsValue] 是没有意义的,因为它 总是 结果是 JsSuccess[JsValue]。另一个问题是您随后尝试从 JsSuccess[JsValue] 中匹配 JsSuccess[String],但出于多种原因您无法做到这一点。第一,类型参数在运行时被擦除,正如编译器警告所指出的那样。第二,JsSuccess[String] 不能是 JsSuccess[JsValue],类型不相关。

    你真正需要的是validate[String].

  2. 除非您提供相关的 JSON.

  3. ,否则可能无法调试

不过,还有一种更优雅的方法可以做到这一点。由于您似乎并不关心失败(您正在为 null 丢弃它们),您可以只使用 asOpt。在这里我要说的是,如果有可能没有 next,那么 nextUrl 应该是 Option[String] 而不是 String,而且你永远不应该使用 [=20] =] 在 Scala 中。

val nextUrl: Option[String] = (ch \ "paging" \ "next").asOpt[String]

如果您出于某种原因必须使用 null:

val nextUrl: String = (ch \ "paging" \ "next").asOpt[String].getOrElse(null)