9

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

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

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

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

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

谢谢

4

2 回答 2

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},)

有点hacky,但它有效。

于 2013-04-14T12:08:21.967 回答
4

几年后,我不得不改变一些东西才能让它发挥作用:

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},)

如果字符串不存在,则读取失败,因此 orElse 方法会处理 JsError。

于 2017-05-14T02:40:00.563 回答