播放JSON可选变压器

Mat*_*ska 9 json scala playframework

我正在使用Play 2.1 JSON Reads来实现条件转换.

我有一个json对象,我想转换一个可选字段删除\n字符.问题是,如果我从发送的JSON中删除内容,我得到验证错误.

该字段是可选的,我不知道如何描述转换是可选的.这是当前的内容转换:

     val transformContent = (__ \ 'content).json.update(__.read[JsString].map{ 
         value =>
        JsString(value.value.replaceAll("\n", ""))
  })
Run Code Online (Sandbox Code Playgroud)

如何获得可选的字段转换?我应该用Reads.verifyingIf吗?

谢谢

Inf*_*ity 9

你可以这样做:

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},)
Run Code Online (Sandbox Code Playgroud)

小hacky,但它的工作原理.