首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在scala中从字符串中检索值

问在scala中从字符串中检索值
EN

Stack Overflow用户
提问于 2020-07-13 14:44:34
回答 3查看 87关注 0票数 1

我正在开发scala应用程序,我正在使用bdd cucumber编写自动化测试用例。我使用以下代码从URL获取数据。

代码语言:javascript
复制
 val url = "http://api.hostip.info/get_json.php?ip=12.215.42.19"
  val result = scala.io.Source.fromURL(url).mkString
  println(result)

这将给出以下输出

代码语言:javascript
复制
{"options": [], "status": "up", "Time": "3:30"}

因为这是字符串,所以我希望检索status参数的值(即up),因为它可以在运行时动态更改。我想过使用split或其他方法来做这件事,但不知道如何在变量中获取status的值。如何在变量中获取状态值?

EN

回答 3

Stack Overflow用户

发布于 2020-07-13 15:00:16

可以使用正则表达式模式来完成。

代码语言:javascript
复制
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 -模式可能出现在测试string
  • result match {}中的任何位置-测试string
  • result match {}中的字符串- "返回variable
  • case statPttrn(s) -如果在测试字符串中的某处找到正则表达式模式,则将捕获的部分放入变量s
  • => s -返回捕获的string
  • case _ => "unknown" -未找到正则表达式模式,返回默认字符串值
票数 2
EN

Stack Overflow用户

发布于 2020-07-13 16:01:51

如果可以保证返回有效的JSON,那么使用JSON解析库比使用regex更好。例如,这里有一种使用Play JSON阅读JSON的方法:

代码语言:javascript
复制
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将所有字段存储在一个类中,以便于访问,如下所示:

代码语言:javascript
复制
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

A Scastie for this one too

请注意,要使用Play JSON,您需要位于Play项目中,或者在build.sbt中包含以下依赖项:

代码语言:javascript
复制
libraryDependencies ++= Seq(
  "com.typesafe.play" %% "play-json" % "2.9.0"
)
票数 1
EN

Stack Overflow用户

发布于 2020-07-13 16:18:57

如果您使用的是scala 2.13,您还可以直接在字符串上进行模式匹配:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62870528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档