我正在开发scala应用程序,我正在使用bdd cucumber编写自动化测试用例。我使用以下代码从URL获取数据。
val url = "http://api.hostip.info/get_json.php?ip=12.215.42.19"
val result = scala.io.Source.fromURL(url).mkString
println(result)这将给出以下输出
{"options": [], "status": "up", "Time": "3:30"}因为这是字符串,所以我希望检索status参数的值(即up),因为它可以在运行时动态更改。我想过使用split或其他方法来做这件事,但不知道如何在变量中获取status的值。如何在变量中获取状态值?
发布于 2020-07-13 15:00:16
可以使用正则表达式模式来完成。
val result = """{"options": [], "status": "up", "Time": "3:30"}"""
val statPttrn = """"status": "([^"]+)"""".r.unanchored
val status = result match {
case statPttrn(s) => s
case _ => "unknown"
}
//status: String = up正则表达式模式解释:
""" -此模式将在it"status": "中包含引号字符-模式以这11个characters([^"]+)开头-捕获所有不是引号的内容"" - capture"""后面必须有引号- end of pattern.r -编译为正则表达式(regular expression).unanchored -模式可能出现在测试stringresult match {}中的任何位置-测试stringresult match {}中的字符串- "返回variablecase statPttrn(s) -如果在测试字符串中的某处找到正则表达式模式,则将捕获的部分放入变量s=> s -返回捕获的stringcase _ => "unknown" -未找到正则表达式模式,返回默认字符串值发布于 2020-07-13 16:01:51
如果可以保证返回有效的JSON,那么使用JSON解析库比使用regex更好。例如,这里有一种使用Play JSON阅读JSON的方法:
import play.api.libs.json._
val url = "http://api.hostip.info/get_json.php?ip=12.215.42.19"
val result = scala.io.Source.fromURL(url).mkString
val json = Json.parse(result)Here's a Scastie example (注意:它不安全,因为它使用.get而不是.getOrElse)
更好的是,此时您可以使用Play JSON将所有字段存储在一个类中,以便于访问,如下所示:
import play.api.libs.json._
case class MyClass(myField: String, myField2: Int)
object MyClass {
// out of the box conversion between JSON and model
implicit val format: OFormat[MyClass] = Json.format[MyClass]
}
val result = """{"myField": "beans", "myField2": 123}"""
val model = Json.parse(result).as[MyClass] // .asOpt is safer, puts class inside Option
model.myField // beans
model.myField2 // 123请注意,要使用Play JSON,您需要位于Play项目中,或者在build.sbt中包含以下依赖项:
libraryDependencies ++= Seq(
"com.typesafe.play" %% "play-json" % "2.9.0"
)发布于 2020-07-13 16:18:57
如果您使用的是scala 2.13,您还可以直接在字符串上进行模式匹配:
val json = """{"options": [], "status": "up", "Time": "3:30"}"""
val status = json match {
case s"""{"options": [$_], "status": "$status", "Time": "$_"}""" => Some(status)
case _ => None
}
println(status) //Some(up)$_匹配任意值,然后将其丢弃。这里使用了它,所以如果Time或options与示例中使用的不同,模式匹配也会起作用。
https://stackoverflow.com/questions/62870528
复制相似问题