For Expression中的多个字段

时间:2013-10-16 21:24:39

标签: scala map

给定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[?]

1 个答案:

答案 0 :(得分:2)

我认为这个问题来自这样一个事实:for comprehension从一个List开始,然后最终在一个Option上工作(来自getObjMap)。构造的类型需要在整体上保持不变以便理解。在.toList调用的结果上调用getObjMap修复此问题:

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