播放JSON可选变压器

时间:2013-04-14 10:43:55

标签: 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", ""))
  })

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

由于

2 个答案:

答案 0 :(得分: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,但它确实有效。

答案 1 :(得分:3)

几年后,我不得不改变一些事情以使其发挥作用:

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。