如何在Scala中获取此实际值:右(Vector(“abc”))

时间:2015-08-19 12:24:40

标签: json scala vector gatling-jsonpath

我正在使用Gatling来测试基于WebSocket的服务,为了解析json响应,我得到了以下内容:

val initiator = JsonPath.query("$.header.initiator", json).right.map(_.toVector)

印刷发起人告诉我这是:

Right(Vector(guest3075085133639688955@example.com))

现在向初学者Scala提问:

如何获取实际字符串值“guest3075085133639688955@example.com”?

我已经明白Right只是一个容器,它包含一个带有一个值的Vector(我想要的值),但是我该怎么做呢? :)

我试过这个,但是只打印相同的东西(右(Vect ....):

initiator.foreach{println}

干杯, 尼古拉斯

3 个答案:

答案 0 :(得分:0)

  • 您可以使用right获取RightProjectionEither的{​​{1}} get以获取Right
  • 中的值
  • 您可以使用head获取Vector中的第一个(仅限您的情况)元素。

看起来像:

val initiator: Either[String, Vector[String]] = 
  Right(Vector("guest3075085133639688955@example.com"))

initiator.right.get.head
// String = guest3075085133639688955@example.com

你也可以进行模式匹配:

val Right(Vector(email)) = initiator
// email: String = guest3075085133639688955@example.com

请注意,这两种方式仅在initiatiorRight且内部Vector至少包含一个元素时才有效。您的问题并不清楚,您希望如何处理Left和/或空Vector

如果您想以其他方式处理所有失败案例,可以使用:

initiator match {
  case Right(Vector(email)) => email // ok
  case _ => // default -> fail
}

答案 1 :(得分:0)

来自Either的

initiator.right.get不安全。因为如果是左值,它会抛出java.util.NoSuchElementException

通过模式匹配:

initiator match {
  // when it is a right value, which is a vector with single element
  case Right(Vector(s)) => println(s)
  // when it is a right value, which is a vector with empty or two or more elements.
  case Right(v) => ???
  // when it is a left value
  case Left(l) => ???
}

答案 2 :(得分:0)

在一篇文章中,您澄清了这是针对测试用例的情况。如果您正在使用ScalaTest匹配器,则可以执行以下操作:

initiator should matchPattern{case Right(Vector("expected value")) => }