在Play中解析QueryString

时间:2014-03-06 02:36:09

标签: scala playframework-2.0

我已将嵌套的url参数传递给端点,我需要将这些参数表示为JsValue。我最初的假设是Play会以类似于Rails的方式解析它们,但参数似乎只能被&=分开。例如:

查询参数:?test[testkey]=testvalue&test[newkey]=newvalue

实际值:

Map( "test[testkey]" -> "testvalue" , "test[newkey]" -> "newvalue )

预期:

Map( "test" -> Map( "testkey" -> "testvalue" , "newkey" -> "newvalue" ) )

请注意,此处的最终目标是能够将其转换为JsObject。

我自己开始写这篇文章,但是简单地从Rack移植这个函数是非常不可靠的,我觉得必须有一个快速的方法来解决这个问题,我只是遗漏了。

更新

我试图找到一个模仿Rails使用的解析的通用解决方案(即嵌套对象,列表等),而不仅仅是一个深层对象。

1 个答案:

答案 0 :(得分:0)

只是为了好玩,一个选择是做一些事情:

import scala.util.matching.Regex
val pattern = new Regex("""(\w+)\[(\w+)\]""")

val qs : Map[String, Map[String, List[Seq[String]]]] = request.queryString.toList.map {
  case (k, v) =>
    pattern findFirstIn k match {
      case Some(pattern(key, value)) => (key, value, v)
    }
}.groupBy(_._1).mapValues(value => value.groupBy(_._2).mapValues {
  value => value.map(x => x._3)
})

要将此转换为JsValue,我们可以简单地调用:

import play.api.libs.json.Json
Json.toJson(qs)

这假设您的所有网址参数都看起来像map[key]=value。您必须稍微修改代码以适应标准key=value模式。