我正在使用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}
干杯, 尼古拉斯
答案 0 :(得分:0)
right
获取RightProjection
和Either
的{{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
请注意,这两种方式仅在initiatior
为Right
且内部Vector
至少包含一个元素时才有效。您的问题并不清楚,您希望如何处理Left
和/或空Vector
。
如果您想以其他方式处理所有失败案例,可以使用:
initiator match {
case Right(Vector(email)) => email // ok
case _ => // default -> fail
}
答案 1 :(得分:0)
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")) => }