Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 查询字符串解析正在进行中_Scala_Playframework 2.0 - Fatal编程技术网

Scala 查询字符串解析正在进行中

Scala 查询字符串解析正在进行中,scala,playframework-2.0,Scala,Playframework 2.0,我将嵌套的url参数传递给端点,我需要这些参数在中表示为JsValue。我最初的假设是Play将以类似于Rails的方式解析它们,但是参数似乎只被&和=分割。例如: 查询参数:?test[testkey]=testvalue&test[newkey]=newvalue 实际: Map( “测试[testkey]”->“testvalue”, “测试[newkey]”->“newvalue” ) 预期: Map( “测试”->地图( “testkey”->“testvalue”, “newkey

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

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

实际:

Map(
“测试[testkey]”->“testvalue”,
“测试[newkey]”->“newvalue”
)

预期:

Map(
“测试”->地图(
“testkey”->“testvalue”,
“newkey”->“newvalue”
)
)

注意,这里的最终目标是能够将其转换为JsObject

我自己已经开始写这篇文章了,但是从Rack简单地移植函数是非常不可伸缩的,我觉得必须有一种快速的方法来实现这一点,我只是缺少了

更新


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

为了好玩,一个选项是执行以下操作:

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)

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

我也不认为这适用于嵌套数组,如
array[]=6&array[]=7
,或嵌套对象,如
test[a][b]=7
。还是我错了?您是对的。但是,它适用于多重映射;因此map[key]=6&map[key]=7将解析为一个列表。对于其他情况,您必须使用正则表达式。