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
}
我有两个问题
第一个是警告
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
^
第二个是错误的,因为字符串是一个特殊的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
在不使用序列化的情况下验证此元素的正确方法是什么??
谢谢,
三木
您验证不正确。在 JsValue
上调用 validate[JsValue]
是没有意义的,因为它 总是 结果是 JsSuccess[JsValue]
。另一个问题是您随后尝试从 JsSuccess[JsValue]
中匹配 JsSuccess[String]
,但出于多种原因您无法做到这一点。第一,类型参数在运行时被擦除,正如编译器警告所指出的那样。第二,JsSuccess[String]
不能是 JsSuccess[JsValue]
,类型不相关。
你真正需要的是validate[String]
.
除非您提供相关的 JSON.
,否则可能无法调试
不过,还有一种更优雅的方法可以做到这一点。由于您似乎并不关心失败(您正在为 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)
我正在尝试使用这篇文章来实现验证 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
}
我有两个问题
第一个是警告
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 ^
第二个是错误的,因为字符串是一个特殊的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
在不使用序列化的情况下验证此元素的正确方法是什么??
谢谢,
三木
您验证不正确。在
JsValue
上调用validate[JsValue]
是没有意义的,因为它 总是 结果是JsSuccess[JsValue]
。另一个问题是您随后尝试从JsSuccess[JsValue]
中匹配JsSuccess[String]
,但出于多种原因您无法做到这一点。第一,类型参数在运行时被擦除,正如编译器警告所指出的那样。第二,JsSuccess[String]
不能是JsSuccess[JsValue]
,类型不相关。你真正需要的是
validate[String]
.除非您提供相关的 JSON.
,否则可能无法调试
不过,还有一种更优雅的方法可以做到这一点。由于您似乎并不关心失败(您正在为 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)