2014-03-12 3 views
0

세 가지 필드 (서비스, 총칭, 개선됨)를 포함하는 유형 목록이 있습니다. 내가 Json.toJson (myList에)를 사용하여 JSON으로 변환 할 때, 나는 다음과 같은 형식으로 JSON을 얻을 :Scala를 사용하여 Play 프레임 워크의 특정 JSON 형식으로 목록 변환

[ 
    { 
    "services":"S4", 
    "total":1, 
    "improved":1 
    }, 
    { 
    "services":"S1", 
    "total":2, 
    "improved":1 
    }, 
    { 
    "services":"S2", 
    "total":3, 
    "improved":2 
    } 
    ] 

스칼라에서 재생 2.X에서 JSON 라이브러리를 사용하여, 나는 다음과 같은 JSON에 myList에 변환 할 수있는 방법 체재?

[ 
{ 
    "key" : "total", 
    "values" :[ 
     { 
     "services" : "s1", 
     "value" : 2 
     }, 
     "services" : "s2", 
     "value" : 3 
     { 
     "services" : "s4", 
     "value" : 1 
     } 
    ] 
}, 
{ 
    "key" : "improved", 
    "values" :[ 
     { 
     "services" : "s1", 
     "value" : 1 
     }, 
     "services" : "s2", 
     "value" : 2 
     { 
     "services" : "s4", 
     "value" : 1 
     } 
    ] 
} 
] 

미리 감사드립니다.

답변

0

이미 OO 처리되어 있기 때문에, 나는 당신이 JSON에보다 구체적인 객체로 목록을 포장하고 변환 할 수 있습니다 생각 :

case class Foo(services: String, total: Int, improved: Int) 

case class B(key: String, value: Int) 
case class A(key: String, values: Seq[B] = Seq()) 

val myOriginalList = Seq(Foo("S4", 1, 1), Foo("S1", 2, 1), Foo("S2", 3, 2)) 

val transformedList = myOriginalList.foldLeft((A("total"), A("improved")))({ (res, x) => 
    (res._1.copy(values = B(x.services, x.total) +: res._1.values), 
    res._2.copy(values = B(x.services, x.improved) +: res._2.values)) 
}).map({x => List(x._1, x._2)}) 

Json.toJson(transformedList) 

문제의 하나 (또는 ​​아마)이 솔루션을 사용하여, Foo 속성을 동적으로 해석하지 않는다는 것입니다.

또한 JSON 변압기 주위에 자신을 시도 할 수 : http://www.playframework.com/documentation/2.2.x/ScalaJsonTransformers 다음

0

는 스칼라 초보자의 솔루션입니다 (나는 우아한 아니라 확신) : http://www.playframework.com/documentation/2.1.1/ScalaJson

//some data 
case class PatientAggregateValues(total: Int, improved: Int) 
val scoreMap = Map.empty[String, PatientAggregateValues] 
scoreMap += ("S1" -> PatientAggregateValues(2, 1)) 
scoreMap += ("S2" -> PatientAggregateValues(3, 2)) 
scoreMap += ("S4" -> PatientAggregateValues(1, 1)) 

     //main logic 
val totalMap = scoreMap map { case (k,v) => Json.toJson(scala.collection.immutable.Map("service" -> Json.toJson(k), "value" -> Json.toJson(v.total))) } toSeq 

val improvedMap = scoreMap map { case (k,v) => Json.toJson(scala.collection.immutable.Map("service" -> Json.toJson(k), "value" -> Json.toJson(v.improved))) } toSeq 

Json.toJson(scala.collection.immutable.Map("total" -> totalMap, "improved" -> improvedMap)) 
: 여기에서 제공하는 솔루션을 사용하고

감사합니다.

관련 문제