2016-07-19 4 views
0

Ich habe ein Json Objekt, das eine Ausgabe von JSON.parse ist, die von Format istKonvertieren eines JSON Objekt in eine Werteliste eines bestimmten Schlüssels in Scala (play)

{ „main_data“: [{"a": 1, "b": 2}, {"a": 3, "b": 4}, {"a": 5, "b": 6}]}.

Ich möchte eine Liste aus diesem Json-Objekt mit den Werten aller "a" -Schlüssel erstellen. Im obigen Beispiel wird es [1,3,5] sein. Da ich neu in der funktionalen Programmierung bin, fiel mir als Erstes eine For-Schleife ein und durchquerte das Json-Objekt, um die Liste zu erhalten.

Aber ich frage mich, gibt es eine Functional/Scala Weg, um das obige zu tun, mit Map oder FlatMap?

+0

Sie können 'case class's erstellen, die Ihrem JSON-Format entsprechen und es direkt analysieren. Und dann extrahieren Sie Ihre 'a' Werte, siehe [hier] (https://www.playframework.com/documentation/2.5.x/ScalaJson). –

Antwort

1

Sie können so etwas wie dieses

val json = Json.parse(yourJsonString) 
val aKeys = json \\ "a" 
// aKeys: Seq[play.api.libs.json.JsValue] = List(1, 3, 5) 
// If you need integers instead of JsValues, just use map 
val integersList = aKeys.map(x => x.as[Int]) 
1

Es gibt viele Möglichkeiten nutzen. Angenommen, Sie haben:

import play.api.libs.json._ 

val txt = 
    """ 
    |{ "main_data" : [ {"a" : 1, "b" :2} , {"a" : 3, "b" : 4}, {"a" : 5, "b" : 6}]} 
    """.stripMargin 


val json = Json.parse(txt) 

Erster Ansatz, wenn Sie nur in a Interesse:

(json \ "main_data") 
    .as[List[Map[String, Int]]] 
    .flatten 
    .foldLeft(List[Int]()){ 
    case (acc, ("a", i)) => acc :+ i 
    case (acc, _) => acc 
    } 

Der zweite allgemeinere:

(json \ "main_data") 
    .as[List[Map[String, Int]]] 
    .flatten 
    .groupBy(_._1) 
    .map { 
    case (k, list) => k -> list.map(_._2) 
    } 
    .get("a") 

Und das Ergebnis ist:

res0: Option[List[Int]] = Some(List(1, 3, 5)) 
2
import play.api.libs.json._ 

val parsed = Json.parse("""{"main_data":[{"a":1,"b":2},{"a":3,"b":4},{"a":5,"b":6}]}""") 
val keys = parsed \\ "a" 
val result = keys.flatMap(_.asOpt[Int]) // List(1, 3, 5) 
Verwandte Themen