2014-03-12 45 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 
    } 
    ] 

使用Scala中播放2.X JSON庫,我怎麼可以轉換myList中下面的JSON格式?

[ 
{ 
    "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

這裏是Scala的新手的解決方案(我敢肯定,它不是優雅): 我使用這裏提供了一個解決方案: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)) 

謝謝。

相關問題