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