2016-07-11 9 views
0

Ich habe die folgende Zeichenfolge:kann nicht das Feld in der Zeichenfolge JSON finden

val jsonString: String = """{"additionalProperties":{},"annotation":{"type":"getDetails","docId":"doi:10.1186-s13612-016-0045-3","tags":{"wellbeing":7,"mood":6,"memories":6,"tmr":3,"participants":3},"additionalProperties":{}}}""" 

Ich möchte tags extrahieren und dieses Feld in einen String zu konvertieren. Dies ist, wie ich es playframework mit:

val parsedJson = Json.parse(jsonString) 
val result = (parsedJson \ "tags").as[JsString].value 
System.out.println(result) 

Dieser Code an der Leitung klemmt val result = (parsedJson \ "tags").as[JsString].value und zurück keine Fehlermeldung.

Deshalb habe ich zwei Fragen:

  1. Was mache ich falsch? Ich würde gerne "tags":{"wellbeing":7,"mood":6,"memories":6,"tmr":3,"participants":3}
  2. bekommen So vermeiden Sie solche Deadlock-Situationen? (d. h. wenn das Feld aus irgendeinem Grund nicht gefunden werden kann)?

Antwort

0

Ich bin mir nicht sicher, warum Sie Code stecken bleibt. In meiner Umgebung gibt es eine schöne Laufzeit Ausnahme. Auf jedem Fall habe man im Grunde zwei Fragen hier:

  1. Beachten Sie, dass der „\“ Operator in Play-json versucht, das Kind mit dem angegebenen Namen zu finden. Sie versuchen also, das Attribut "Tags" aus dem Objekt <root> zu holen, obwohl es tatsächlich Teil des Objekts annotation ist. Um es zu extrahieren: parsedJson \ "annotation" \ "tags"
  2. Die Tags sind im JSON als Objekt kodiert. Play-json versucht, so typsicher wie möglich zu sein, was bedeutet, dass man die JsObject nicht einfach in eine JsString "werfen" kann. Was Sie hier tun könnten, ist das Tag-Objekt als JsObject zu extrahieren und seine toString-Funktion zu verwenden. Dies wird Ihnen geben:

    {"wellbeing":7,"mood":6,"memories":6,"tmr":3,"participants":3}

    Umwandlung dieser in die gewünschte Zeichenfolge sollte trivial sein.

+0

Wie das Tag-Objekt als ein JsObject zu extrahieren? Ich bekomme JsDefined. – Klue

+0

Beide Kommentare können aufgelöst werden mit: '(json \" annotation "\" tags "). As [JsObject]'. Der 'as [JsObject]' Teil transformiert das 'JsDefined' in das' JsObject' – irundaia