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.