Получение значений из строки в scala - PullRequest
1 голос
/ 13 июля 2020

Я работаю над приложением scala, в котором я пишу тестовый пример автоматизации, используя bdd огурец. У меня есть следующий код для получения данных из 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"}

Поскольку это строка, я хочу получить значение статуса параметр (т.е. вверх), так как он может динамически изменяться во время выполнения. Я думал сделать это с помощью split или чего-то еще, но не понял, как получить значение статуса в переменной. Как я могу получить значение статуса в переменной?

Ответы [ 3 ]

2 голосов
/ 13 июля 2020

Может быть выполнено с помощью шаблона регулярного выражения.

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

Объяснение шаблона регулярного выражения:

  • """ - в этом шаблоне будет символ кавычки "
  • "status": " - шаблон начинается с этих 11 символов
  • ([^"]+) - захватить все, что не является цитатой "
  • " - после захвата должна быть цитата
  • """ - конец шаблон
  • .r - скомпилировать как регулярное выражение (регулярное выражение)
  • .unanchored - шаблон может появиться где угодно в тестовой строке
  • result match {} - протестируйте строка в result переменной
  • case statPttrn(s) - если шаблон регулярного выражения был найден где-то в тестовой строке, поместите захваченную часть в переменную s
  • => s - верните захваченная строка
  • case _ => "unknown" - шаблон регулярного выражения не найден, вернуть строковое значение по умолчанию
1 голос
/ 13 июля 2020

Если вы используете 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 отличаются от используемых в вашем примере.

1 голос
/ 13 июля 2020

Если вы можете гарантировать, что он вернет действительный JSON, вам лучше использовать библиотеку синтаксического анализа JSON, чем регулярное выражение. Например, вот один из способов прочитать JSON с помощью Play 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)

Вот Scast ie, пример (примечание: это небезопасно, поскольку в нем используется .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

Scast ie для этого тоже

Обратите внимание, что для использования Play JSON вам нужно либо находиться внутри проекта Play, либо включить следующую зависимость в свой build.sbt:

libraryDependencies ++= Seq(
  "com.typesafe.play" %% "play-json" % "2.9.0"
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...