Scala json .transform: изменение содержимого массива в JsObject - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть этот код, который получает 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]]

Как мне написать эту функцию для изменения строковых значений массива?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...