2013-10-16 155 views
0

給定一個JsObject的列表,我想將它轉換爲Map[String, JsValue],然後遍歷每個映射的鍵值對,從而爲每個對創建一個JsObject。最後,我想將所有這些JsObject放入一個List[JsObject]表達式中的多個字段

下面是我用for表達式的嘗試。

def getObjMap(obj: JsObject): Option[Map[String, JsValue]] = obj match { 
    case JsObject(fields) => Some(fields.toMap) 
    case _ => None 
} 

def createFields(x: (String, JsValue)): JsObject = Json.obj("n" -> x._1, 
                  "v" -> x._2)  
val objects: List[JsObject] = foo() 

val res: List[JsObject] = for { 
          obj <- objects 
          map <- getObjMap(obj) 
          mapField <- map 
          } yield(createFields(mapField)) 

但是,我在mapField <- map行上收到編譯時錯誤。

[error] ...\myApp\app\services\Test.scala:65: type mismatch; 
[error] found : scala.collection.immutable.Iterable[play.api.libs. 
                    json.JsObject] 
[error] required: Option[?] 

回答

2

我認爲問題的根源是,對於修真開始通過在工作表的事實來了,然後結束了在某個選項的工作(從getObjMap)。爲了理解,構造的類型需要保持不變。在getObjMap呼叫修復的結果調用.toList此:

val res: List[JsObject] = for { 
          obj <- objects 
          map <- getObjMap(obj).toList 
          mapField <- map 
          } yield(createFields(mapField)) 
+0

謝謝,我會嘗試了這一點。在附註中,我的代碼看起來如何?它是習語還是垃圾?我能做得更好嗎? –

+0

到目前爲止我沒有看到任何問題。 – Shadowlands

+0

工作,謝謝,Shadowlands。我沒有包含它,但我有我的'createFields(...)'函數包含第三個字段('l'(lineNumber)),其中,對於對象中的每個obj,我需要增加一個lineNumber。目前,我在getObjMap(...')方法的開頭增加了lineNumber。我怎麼能仍然使用for表達式增加lineNumber? –