我已将嵌套的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使用的解析的通用解决方案(即嵌套对象,列表等),而不仅仅是一个深层对象。
答案 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
模式。