我正在使用Play 2.1 JSON Reads来实现条件转换。
我有一个json对象,我想转换一个可选字段,删除\ n字符。问题是,如果我从发送的JSON中删除内容,我会收到验证错误。
此字段是可选的,我不知道如何描述转换是可选的。 这是当前的内容转换:
val transformContent = (__ \ 'content).json.update(__.read[JsString].map{
value =>
JsString(value.value.replaceAll("\n", ""))
})
如何获得可选的字段转换?我应该使用Reads.verifyingIf
吗?
由于
答案 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。