2014-03-06 48 views
2

我有嵌套的url參數傳遞給一個端點,我需要這些表示爲JsValue。我最初的假設是Play會以類似於Rails的方式解析它們,但參數似乎只能被&=分開。例如:在播放QueryString解析

查詢參數:?test[testkey]=testvalue&test[newkey]=newvalue

實際:

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

預計:

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

請注意,這裏的最終目標是能夠將其轉換成一個JsObject。

我已經開始自己寫這個了,但是簡單地從Rack上移植這個函數是非常不方便的,我覺得必須有一個快速的方法來獲得這個,我只是想念。

UPDATE

我試圖找到模仿Rails用到的解析(即與嵌套對象,列表等),一個通用的解決方案,而不是一個級別深度的對象。

回答

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模式。

+0

我也不認爲這將適用於嵌套數組,如'array [] = 6&array [] = 7',或嵌套對象,如'test [a] [b] = 7'。還是我不正確? –

+0

你是對的。但是,它將適用於multimap;所以map [key] = 6&map [key] = 7會解析成列表。對於其他情況,你將不得不使用正則表達式。 – mantithetical

相關問題