2013-10-16 9 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

감사합니다, 나는 그것을 밖으로 시도 할 것이다. 참고로 내 코드는 어떻게 보이나요? 그것은 idomatic 또는 쓰레기? 내가 더 잘할 수 있을까? –

+0

지금까지 아무런 문제가 보이지 않습니다. – Shadowlands

+0

그 덕분에, Shadowlands. 나는 그것을 포함하지 않았지만, 나는'createFields (...)'함수에 세 번째 필드 ('l' (lineNumber))가있다. 여기서 object의 각 obj에 대해 lineNumber를 증가시켜야한다. 현재, 나는'getObjMap (...') 메소드의 시작 부분에서 lineNumber를 증가시킨다. for 표현식을 사용하여 lineNumber를 계속 증가 시키려면 어떻게해야합니까? –

관련 문제