2016-04-04 3 views
0

Ich habe ein JsValue das folgende JSON-Objekt entspricht:Wie schalte ich JSON in plain old Daten (Karte, Liste, String, Int etc.) in Scala/Wiedergabe

{"foo": [{"id": 1, value: "bar"}, {"id": 2, "value": "baz"}, ...]} 

Gibt es eine einfache Möglichkeit, um dies in eine Map(String, List(Map(String, Either(String, Int)))) oder eine andere Struktur von regulären ol 'Daten umzuwandeln?

Ich möchte den JSON abfragen, ob <anonymous outermost value>["foo"]{"id": 42, "value": "Towel"} enthält. Dies wäre für mich einfach, wenn ich das JsValue-Objekt in einfache alte Sammlungen * konvertieren könnte. Gibt es eine andere direkte Möglichkeit, dies für JsValue-Objekte zu tun?

(*) Ich denke, es wäre etwas wie anonymous_outermost_value("foo") contains Map("id" -> Left(42), "value" -> Right("Towel")).

(In dieser speziellen Anwendung, würde ich in Ordnung sein mit der Umwandlung alle IDs in Strings und Drehen des Either(String, Int) in nur String, wenn das Material erleichtert.)

Antwort

0

Businesses Map, List usw. ist nicht einfacher als arbeite mit Playframework Json. Wenn Sie den üblichen Weg zur Arbeit mit Daten verwenden möchten, hilft Ihnen JSON basics.

Sie müssen Wandler implementieren Json < -> Plain Objekte mit Json Reads[T] und Writes[T]

Zum Beispiel Json Objekt {"id": 1, value: "bar"} mit case class A(id: Long, value: String) und {"foo": [{"id": 1, value: "bar"}.. mit case class B(foo: List[A]), dargestellt. Der einfachste Weg zum Implementieren Konverter Json < -> Plain-Objekte ist Json.format [T] -Makros. >Json.fromJson[T](json: JsValue) für < T Umwandlung - -

implicit val aFormat = Json.format[A] 
implicit val bFormat = Json.format[A] 

Dann können Sie Json.toJson[T](o: T) < verwenden> JsValue

0

Sie konnten die JsValue zu einem JsObject konvertieren (die um einen Map[String, JsValue] einfach ein Wrapper ist), Extrahieren des foo Eigenschaft als JsArray (das ist ein Wrapper um eine Seq[JsValue]) und so weiter. Aber ich denke, es ist wirklich einfacher, einfach die Json-Funktionen zu verwenden:

for { 
    foo <- (json \ "foo").validate[Seq[JsObject]] 
    obj <- foo 
    id <- (obj \ "id").validate[Int] 
    value <- (obj \ "value").validate[String] 
    if id == 42 && value == "Towel" 
} { 
    // do something 
}