2016-05-01 14 views
1

die folgende JSON Bedenken Sie:Play-Framework-JsReads für Objektnamen und Werte

{ 
    "1992": "this is dog", 
    "1883": "test string", 
    "1732": "unknown", 
    "2954": "future year" 
} 

Gibt es eine Möglichkeit, mit JSON reads dieses JSON in eine Scala Fallklasse zu verwandeln? d.h. ein Seq[Years] oder ein Map[String, String], wo ein Jahr das Jahr und die Beschreibung hält.

als Referenz, das ist, wie Sie eine read für eine "einfache" JSON-Struktur definieren:

{ 
    "name": "george", 
    "age": 24 
} 

Die implizite JsReads

implicit val dudeReads = (
    (__ \ "name").read[String] and 
    (__ \ "age").read[Int] 
) (Dude) 

Antwort

3

Ähnlich @ Pranav Antwort, aber prägnanter:

Json.parse(""" 
    { 
     "1992": "this is dog", 
     "1883": "test string", 
     "1732": "unknown", 
     "2954": "future year" 
    } 
""").as[Map[String, String]] 

ergibt

Map[String,String] = Map(1992 -> this is dog, 1883 -> test string, 1732 -> unknown, 2954 -> future year) 

Die zugrunde liegende Readshere definiert sind.

4

Konvertieren Sie Ihre JSON-String zu JsValue und verwenden dann validieren auf das JsValue-Objekt.

scala> val json: JsValue = Json.parse(""" 
| { 
| "1992": "this is dog", 
| "1883": "test string", 
| "1732": "unknown", 
| "2954": "future year" 
| } 
| """) 
json: play.api.libs.json.JsValue = {"1992":"this is dog","1883":"test string","1732":"unknown","2954":"future year"} 

scala> val valid = json.validate[Map[String,String]] 
valid: play.api.libs.json.JsResult[Map[String,String]] = JsSuccess(Map(1992 -> this is dog, 1883 -> test string, 1732 -> unknown, 2954 -> future year),) 

scala> valid match { 
| case s: JsSuccess[Map[String,String]] => println(s.get) 
| case e: JsError => println("Errors: " + JsError.toJson(e).toString()) 
| } 
Map(1992 -> this is dog, 1883 -> test string, 1732 -> unknown, 2954 -> future year) 
+0

Sie können die Validierung und nachfolgende Übereinstimmung überspringen, indem Sie einfach 'val result = json.as [Map [String, String]]' schreiben. – Eric

+1

@Eric Die as-Methode löst eine 'JsResultException' aus, wenn der Pfad nicht gefunden wird oder die Konvertierung nicht möglich ist. [Quelle] (https://www.playframework.com/documentation/2.5.x/ScalaJson#Using-JsValue.as/asOpt) – Pranav