json scala playframework-2.0 playframework-2.1

Cómo reemplazar un valor JSON en Play



scala playframework-2.0 (5)

Algo a lo largo de las líneas de:

val updatedJson = if((request.body / "customerId").as[Int] == -1){ val newId = JsObject(Seq(("customerId",JsString("ID12345")))) (request.body ++ newId).as[JsValue] } else request.body updatedJson.validate[Report](Reports.readsWithoutUser).map { case _: Report =>

¿Cómo reemplazo un valor en un valor JSON en Play?
Código para ilustrar:

def newReport() = Action(parse.json) { request => var json = request.body if((json / "customerId").as[Int] == -1){ // replace customerId after some logic to find the new value } json.validate[Report](Reports.readsWithoutUser).map { case _: Report =>


De acuerdo con la documentación de Play , JsObjects tiene un método ++ que fusionará dos JsObjects. Entonces, cuando tenga su nuevo valor entero, simplemente necesita:

val updatedJson = json.as[JsObject] ++ Json.obj("customerId" -> newValue)

A partir de Play 2.4.x puedes usar + :

val updatedJson = json.as[JsObject] + ("customerId" -> newValue)

(NOTA: el método + ya se agregó en 2.1.x pero agrega un campo duplicado al objeto en lugar de reemplazar el valor existente en versiones anteriores a 2.4.x)


Estoy considerando alejarme de todas esas soluciones inmutables de "JSON". Solo hace que el código sea un desastre horrible. Así es como se vería en SON of JSON :

import nl.typeset.sonofjson._ val json = … if (json.customerId.as[Int] == -1) { json.customerId = 987938 }


Un enfoque es, como dice Marc B, convertir el JSON en algo así como una clase de caso, manipular eso y luego crear un nuevo JSON.

Sin embargo, también puede utilizar transformadores JSON. Efectivamente, lo que haces es construir un objeto de Lectura [Algo]. Este objeto se pasa al método de transformación al que llama en su objeto JSON. Cambiará el objeto JSON y devolverá un éxito (resultado) o un error (error) donde el resultado es el nuevo JSON modificado. Aquí hay un ejemplo (comparativamente) muy simple:

usando json de formato: {clave -> valor}

def jsonXForm(value: String) = (__ / "customerId").json.update( (__ / "customerId").json.put(JsString(value)) ) json.transform(jsonXForm(yourNewValue)) match {...}`

Hay una guía decente here


una versión glorificada de la respuesta de Zeimyth que usa conversión implícita

implicit class JsObjectEnhancer(jsObject: JsObject) { def update(args: (String, Json.JsValueWrapper)*): JsObject = { jsObject ++ Json.obj(args: _*) } }

uso (json debe ser del tipo JsObject y la clase implícita debe estar dentro del alcance)

json.update("customerId", 1000)