2013-12-18 3 views
0

하나의 json에서 다른 json으로 데이터를 병합하려면 scala lift를 사용하십시오. 아래 예제에서 "jsonGroups"에서 "tom"과 "dan"그룹의 일부를 모두 집계하여 grpCount를 "jsonNames"에 삽입합니다. println (newJson)은 finalOutput과 같아야합니다. 효율적인 방법은 무엇입니까? 나는 코드의 줄이 훨씬 줄어들 수 있다는 것을 알고있다.스칼라 리프트를 사용하여 효율적으로이를 수행하는 방법은 무엇입니까?

val jsonNames = """ 
{ 
    "id" : "1B23423B", 
    "payload" : { 
     "list" : [ { 
       "age" : "30", 
       "name" : "tom", 
      }, { 
       "age" : "35", 
       "name" : "dan" 
      }] 
    } 
} 
""" 

val jsonGroups = """ 
{ 
    "id" : "1B23423B", 
    "payload" : { 
     "list" : [ { 
       "group" : "baseball", 
       "name" : "tom", 
      }, { 
       "group" : "basketball", 
       "name" : "tom" 
      }, { 
       "group" : "football", 
       "name" : "dan" 
      }, { 
       "group" : "hockey", 
       "name" : "dan" 
      }, { 
       "group" : "football", 
       "name" : "dan" 
      }] 
    } 
} 
""" 

val finalOutput = """ 
{ 
    "id" : "1B23423B", 
    "payload" : { 
     "list" : [ { 
       "age" : "30", 
       "name" : "tom", 
      "groupCnt" : 2 
      }, { 
       "age" : "35", 
       "name" : "dan", 
      "groupCnt" : 3 
     }] 
    } 
} 
""" 

val jsGroups = parse(jsonGroups) 
val groupList = jsGroups \ "payload" \ "list" 
val groupMap = new HashMap[String, Int] 
groupList.children.foreach { g => 
    val group = (g \ "group").values.toString 
    val name = (g \ "name").values.toString 
    Option(groupMap.get(name)) match { 
    case Some(x) => 
     groupMap.put(name, x + 1) 
    case None => 
     groupMap.put(name, 1) 
    } 
} 

val jsNames = parse(jsonNames) 
val newJson = jsNames.transform({ 
    case dataObject @ JObject(fields) if fields.contains(JField("name", JString(name)))) => 
    val groupCnt = groupMap.get(name) 
    dataObject.merge(("groupCnt" -> groupCnt)) 
}) 

println (pretty(render(newJson))) 

답변

0

거기에는 여러 가지 방법이있을 수있다. 개인적으로 내가 사용하는 것은 사례 클래스입니다. 따라서

case class JsonGroup(id: String, payload: Payload) 
case class Payload(list: List[PayloadList]) 
case class PayloadList(group: String, name: String) 
val groups: Option[JsonGroup] = jsonGroups.extractOpt[JsonGroup] 

groups.foreach(group => println(group.payload.list(2).name) 

그런 다음 사용자 지정 논리를 수행해야합니다.

+0

내가 병합 기능을 사용할 수 있지만, "톰"과 "단"이 그룹에 속하고 첫 번째 json으로 그룹 수를 병합하는 횟수를 어떻게 계산합니까? –

+0

* 대답을 편집했습니다 – VasyaNovikov

+0

질문을 업데이트했습니다. 내 예제 논리를 기반으로 오전? –

관련 문제