2014-10-11 65 views
0

我正在使用play framework和Scala。如何使用播放框架在scala中將列表數據轉換爲Json?

我有以下列表 -

List(
    (C: - read,1412750402124,46552070), 
    (C: - write,1412750402124,433057), 
(E: - read,1412750402124,5435), 
(E: - write,1412750402124,1728), 
(F: - read,1412750402124,5435), 
(F: - write,1412750402124,1728), 
(C: - read,1412750402125,46552071), 
(C: - write,1412750402125,433060), 
(E: - read,1412750402125,5445), 
(E: - write,1412750402125,1730), 
(F: - read,1412750402125,5450), 
(F: - write,1412750402125,1428) 
) 

我想下面的輸出 -

key:[ 
{"name":"C:-read", 
data:[[1412750402124,46552070],[1412750402125,46552071]...] 
}, 
{ 
"name":"C:-write", 
data:[[1412750402124,433057],[1412750402125,433060]...] 
}, 
{ 
"name":"E:-read", 
data:[[1412750402124,5435],[1412750402125,5445]...] 
}, 
{ 
"name":"E:-write", 
data:[[1412750402124,1728],[1412750402124,1730]...] 
}, 
{ 
"name":"F:-read", 
data:[[1412750402124,5435],[1412750402125,5450]...] 
}, 
{ 
"name":"F:-write", 
data:[[1412750402124,1728],[1412750402124,1428]...] 
} 
] 

使用Scala中如何獲得上述輸出?

回答

1

輸入列表無法編譯,有些信息丟失,所以我做了一些假設。

val lst = List(
    ("C: - read", 1412750402124L, 46552070), 
    ("C: - write", 1412750402124L, 433057), 
    ("E: - read", 1412750402124L, 5435), 
    ("E: - write", 1412750402124L, 1728), 
    ("F: - read", 1412750402124L, 5435), 
    ("F: - write", 1412750402124L, 1728), 
    ("C: - read", 1412750402125L, 46552071), 
    ("C: - write", 1412750402125L, 433060), 
    ("E: - read", 1412750402125L, 5445), 
    ("E: - write", 1412750402125L, 1730), 
    ("F: - read", 1412750402125L, 5450), 
    ("F: - write", 1412750402125L, 1428)) 

由於結果由第一字符串分組(例如, 「C: - 讀」)的第一個步驟是執行分組:

scala> val groupedData= lst.groupBy(_._1).map{ case (k,v) => k -> v.map(i => List(i._2, i._3))}.toList 
groupedData: List[(String, List[List[Long]])] = List((C: - write,List(List(1412750402124, 433057), List(1412750402125, 433060))), (E: - read,List(List(1412750402124, 5435), List(1412750402125, 5445))), (F: - write,List(List(1412750402124 

,1728),表(1412750402125,1428 )),(F: - 讀,列表(列表(1412750402124,1728),列表(1412750402125,1730)),(列表(1412750402124,5435),列表(1412750402125,5450))) ),(C: - 讀,列表(列表(1412750402124,465552070),列表( 1412750402125,465552071))))

注意結果是List[(String, List[List[Long]])]。這將使序列化更容易。
遊戲有很大的JSON庫,它可以很容易地 '寫' 做:

implicit val itemWrites = new Writes[(String, List[List[Long]])] { 
    def writes(t: (String, List[List[Long]])) = Json.obj(
    "name" -> t._1, 
    "data" -> t._2) 
} 

,現在它可以連載:

scala> Json.toJson(groupedData) 
res23: play.api.libs.json.JsValue = [{"name":"C: - write","data":[[1412750402124,433057],[1412750402125,433060]]},{"name":"E: - read","data":[[1412750402124,5435],[1412750402125,5445]]},{"name":"F: - write","data":[[1412750402124,1728] 

,[1412750402125,1428]},{」 name「:」F: - read「,」data「:[[1412750402124,5435],[1412750402125,5450]]},{」name「:」E: - write「,」data「:[[[1412750402124,1728 ],{「name」:「C: - read」,「data」:[[1412750402124,46552070],[141275040212 5,46552071]]}]

相關問題