2013-12-18 6 views
0

Я хочу объединить данные из одного json в другой json, используя scala lift. В примере ниже, в «jsonGroups», я хочу считать, что все группы «tom» и «dan» являются частью и вставляют grpCount в «jsonNames». Для println (newJson) необходимо значение finalOutput. Что такое эффективный способ сделать это? Я знаю, что это может быть уменьшено до гораздо меньших строк кодаЧто такое эффективный способ сделать это с помощью scala lift?

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

Я знаю, что могу использовать функцию слияния, но как я могу подсчитать количество раз, когда «tom» и «dan» принадлежит к группе и объединяют счет группы в первый json? –

+0

* отредактировал ответ – VasyaNovikov

+0

Я обновил вопрос .. am i off, основанный на моем примере логики? –