从Lift,我得到一个表格
的字符串TOKEN=EC%2d454178600K772032D&TIMESTAMP=2011%2d06%2d29T13%3a10%3a58Z&CORRELATIONID=cbd56e97cad38&ACK=Success&VERSION=64&BUILD=1936884
来自HTTP请求的响应。
虽然这可能是非常重要的,但我找不到将其解析成一个不错的Map[String, String]
的Lift函数。有什么帮助吗?
答案 0 :(得分:13)
来自Lift的Req.scala:
// calculate the query parameters
lazy val queryStringParam: (List[String], Map[String, List[String]]) = {
val params: List[(String, String)] =
for {
queryString <- request.queryString.toList
nameVal <- queryString.split("&").toList.map(_.trim).filter(_.length > 0)
(name, value) <- nameVal.split("=").toList match {
case Nil => Empty
case n :: v :: _ => Full((urlDecode(n), urlDecode(v)))
case n :: _ => Full((urlDecode(n), ""))
}} yield (name, value)
val names: List[String] = params.map(_._1).distinct
val nvp: Map[String, List[String]] = params.foldLeft(Map[String, List[String]]()) {
case (map, (name, value)) => map + (name -> (map.getOrElse(name, Nil) ::: List(value)))
}
(names, nvp)
}
答案 1 :(得分:4)
我没有看到任何Lift的实现。你可以通过以下方式实现这一目标:
val input = "TOKEN=EC%2d454178600K772032D&TIMESTAMP=2011%2d06%2d29T13%3a10%3a58Z&CORRELATIONID=cbd56e97cad38&ACK=Success&VERSION=64&BUILD=1936884"
val res = input.split('&') map { str =>
val pair = str.split('=')
(pair(0) -> pair(1))
} toMap
注意:它假设您有一个结构良好的字符串。在您的代码中,您应该检查字符串是否正常。
答案 2 :(得分:0)
我整理了一个小型Scala库来帮助完成此操作:https://github.com/theon/scala-uri
您可以解析uri并将参数设置为Map[String,List[String]]
,如下所示:
val uri = parseUri("http://example.com?one=1&two=2").query.params
它还有一个DSL,用于构建带有查询字符串的URL:
val uri = "http://example.com" ? ("one" -> 1) & ("two" -> 2)
答案 3 :(得分:0)
scala> val queryParams = "a=4&b=5"
scala> queryParams.split("&").toList.map(_.trim).filter(_.length > 0).flatMap(x => {
val s = x.split('=')
Map[String, String](s(0) -> s(1))
}).toMap[String, String]
res0: scala.collection.immutable.Map[String,String] = Map(a -> 4, b -> 5)