2016-08-30 1 views
1

Angenommen, ich habe eine JSON wie folgt aus:Play Framework JSON-Transformatoren, wie mit rekursiven Pfaden (jsPath) arbeiten?

{ 
    "name" : "Watership Down", 
    "location" : { 
    "lat" : 51.235685, 
    "long" : -1.309197 
    }, 
    "residents" : [ { 
    "name" : "Fiver", 
    "age" : 4, 
    "role" : null 
    }, { 
    "name" : "Bigwig", 
    "age" : 6, 
    "role" : "Owsla" 
    } ] 
} 

Wenn ich

tun
val transformer1 = (__ \ 'name).json.update(of[JsValue].map(a => JsString("x"))) 

das name Feld zu ändern, es funktioniert "x".

Aber wenn ich will rekursiv alle Namen zu "x" ändern, dachte ich, dass ich nur die rekursive jsPath, wie diese verwenden:

val transformerRecursive = (__ \\ 'name).json.update(of[JsValue].map(a => JsString("x"))) 

Aber wenn ich es versuche, erhalte ich diesen Fehler:

scala> jsobject.transform(transformerRecursive) res1: play.api.libs.json.JsResult[play.api.libs.json.JsObject] = JsError(List((//name,List(ValidationError(List(error.path.result.multiple),WrappedArray())))))

Wie sollte ich rekursive Pfad mit JSON Transformer in Playframework verwenden?

+0

Ich denke, der Fehler meldet, dass es mehrere Spiele für die ' 'name' Attribut. Sie müssen möglicherweise über sie iterieren und sie einzeln aktualisieren – irundaia

Antwort

0

Wie @irundaia sagte, müssen Sie über Arrays durchlaufen und jeden Wert aktualisieren (Verwendung Reads.list für diese):

val t = (__ \ "residents").json.update(
    Reads.list(
    (__ \ "name").json.update(
     Reads.pure(JsString("x")) 
    ) 
).map(JsArray) 
) 

scala> res1: play.api.libs.json.JsResult[play.api.libs.json.JsObject] = JsSuccess({"name":"Watership Down","location":{"lat":51.235685,"long":-1.309197},"residents":[{"name":"x","age":4,"role":null},{"name":"x","age":6,"role":"Owsla"}]},/residents)