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)