У меня есть этот код, который получает JsObject и HOF "f", который изменяет строковые значения:
object Transform {
def transformData(json: JsObject)(f: String => String): Option[JsObject] = {
def transformString(somePath: JsPath): Reads[JsObject] = {
somePath.json
.update(
__.read[String].map {
case ln if ln.nonEmpty => JsString(f(ln))
case empty => JsString(empty)
}
)
.orElse(__.json.pick[JsObject])
}
val jsonTransformer: Reads[JsObject] =
transformString(__ \ Symbol("dataOne")) andThen
transformString(__ \ Symbol("dataTwo"))
json.transform(jsonTransformer) match {
case JsSuccess(result, _) =>
Some(result)
case x =>
None
}
}
}
Я могу проверить с этим кодом:
object TestMaskingData extends App{
val f: String => String = _ => "****"
val strdata =
"""
| {
| "dataOne": "one",
| "dataTwo": "two"
| }
|""".stripMargin
val jsondata = Json.parse(strdata).as[JsObject]
println(Transform.transformData(jsondata)(f))
}
Выход это:
Some({"dataTwo":"****","dataOne":"****"})
Так что это прекрасно работает.
Что если dataTwo является массивом? Что будет изменением в коде? Я думаю, что мне придется переписать jsonTransformer
так:
val jsonTransformer: Reads[JsObject] =
transformString(__ \ Symbol("dataOne")) andThen
transformArray(__ \ Symbol("dataTwo"))
Затем, начиная с функции transformString
, я попытался написать что-то вроде этого:
def transformArray(somePath: JsPath): Reads[JsObject] = {
somePath.json
.update(
__.read[Seq[String]].map {
Я получил здесь ошибка __.read[Seq[String]]
:
No implicits found for parameter: Reads[Seq[String]]
Как мне написать эту функцию для изменения строковых значений массива?