writes play framework json scala playframework

play - Juega el transformador opcional JSON



play json github (2)

Estoy usando Play 2.1 JSON Reads para lograr una transformación condicional.

Tengo un objeto json y quiero transformar un campo opcional para eliminar / n caracteres. El problema es que si elimino el contenido del JSON enviado, obtengo un error de validación.

Este campo es opcional y no sé cómo describir que la transformación es opcional. Esta es la transformación de contenido actual:

val transformContent = (__ / ''content).json.update(__.read[JsString].map{ value => JsString(value.value.replaceAll("/n", "")) })

¿Cómo puedo obtener una transformación de campo opcional? ¿Debo usar Reads.verifyingIf ?

Gracias


Puedes hacerlo:

val json = Json.obj("whatever" -> 1, "content" -> "hello world") val json2 = Json.obj("whatever" -> 1) val transformer = (__ / ''content).json.update( __.readOpt[JsString].map{ case Some(JsString(str)) => JsString(str.replaceAll("world", "scala")) } ).orElse(__.json.pick[JsObject]) json.transform(transformer) //JsSuccess({"whatever":1,"content":"hello scala"},) json2.transform(transformer) //JsSuccess({"whatever":1},)

Pequeño hacky, pero funciona.


Unos años más tarde tuve que cambiar algunas cosas para que funcione:

val json = Json.obj("whatever" -> 1, "content" -> "hello world") val json2 = Json.obj("whatever" -> 1) val transformer = (__ / ''content).json.update( __.read[JsString].map { case JsString(str) => JsString(str.replaceAll("world", "scala")) } ).orElse(__.json.pick[JsObject]) json.transform(transformer) //JsSuccess({"whatever":1,"content":"hello scala"},) json2.transform(transformer) //JsSuccess({"whatever":1},)

La lectura falla si la cadena no está presente, por lo tanto, los métodos orElse manejan el JsError.