2016-08-06 38 views
2

Ich erhalte einige JSON von einem Server:Wie mit entkam Anführungszeichen in Play einen JSON-String lesen

"payload":"{\"action\":\"schedule\"}" 

Denn warum ich erhalte diese unansehnliche JSON this question sehen. Ich habe einige Code geschrieben dieses Bit des Objekts zu analysieren:

implicit val botPayloadReads: Reads[BotPayload] = (
    (JsPath \ """\"action\"""").read[String] and 
     (JsPath \ """\"returnToAction"""").readNullable[String] 
    )(BotPayload.apply _) 

Aber ich erhalte eine Fehlermeldung:

List((/entry(0)/messaging(0)/postback/payload/\"action\",List(ValidationError(List(error.path.missing),WrappedArray())))) 

die ein wenig seltsam ist, weil der Pfad \ „Aktion \“ ist genau das, wonach wir suchen.

+0

Ich denke, ich muss nur die – Chris

+0

Streifen entfernen Yep das war es. – Chris

Antwort

1

Der Grund, warum diese Anführungszeichen gemerkt sind, ist, dass der Schlüssel "payload" tatsächlich den Typ String hat, also enthält er eine Zeichenfolgendarstellung eines Objekts. Das ist sehr seltsam für einen Server, wirklich zurückzukehren. Sie müssen den Inhalt des Werts payload im Wesentlichen erneut analysieren oder den JSON vorverarbeiten. Dies kann jedoch alles mit der JSON-API von Play geschehen.

import play.api.data.validation.ValidationError 
import play.api.libs.json._ 
import scala.util.{ Success, Try } 

case class BotPayload(action: String, returnToAction: Option[String]) 

object BotPayload { 

    val payloadReads = Json.reads[BotPayload] 

    implicit val reads: Reads[BotPayload] = Reads.StringReads 
    .map(s => Try(Json.parse(s))) 
    .collect(ValidationError("Cound not parse content of payload")) { 
     case Success(js) => js 
    } 
    .andThen(payloadReads) 

} 

scala> val js = Json.parse(""" {"payload":"{\"action\":\"schedule\"}"} """) 
js: play.api.libs.json.JsValue = {"payload":"{\"action\":\"schedule\"}"} 

scala> (js \ "payload").validate[BotPayload] 
res0: play.api.libs.json.JsResult[BotPayload] = JsSuccess(BotPayload(schedule,None),) 
+0

Ich landete das heraus ziehen, aber das sieht wie eine gute Lösung aus. Der Server erlaubt es dem Benutzer, jede beliebige UTF-8-Zeichenfolge als Payload zu übergeben, und damit enden wir mit dieser Situation, als ich JSON wählte. Vielleicht wäre es sinnvoller, ein JSON-Objekt zu benötigen, da es sich ohnehin in der Mitte eines JSON-Objekts befindet. – Chris