Scala 查询字符串解析正在进行中
我将嵌套的url参数传递给端点,我需要这些参数在中表示为JsValue。我最初的假设是Play将以类似于Rails的方式解析它们,但是参数似乎只被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
&
和=
分割。例如:
查询参数:?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将解析为一个列表。对于其他情况,您必须使用正则表达式。