Изменить поле на любом уровне с помощью оптики - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь преобразовать поле "модель" на любом уровне с помощью оптической системы, и у меня возникают проблемы с достижением этого.

Ввод:

{
  "model":"ModelExample1",
  "test": {
    "model":"ModelExample2"
  }
}

Ожидаемый выход:

{
  "model":"AAAA-ModelExample1",
  "test": {
    "model":"AAAA-ModelExample2"
  }
}

1 Ответ

1 голос
/ 24 июня 2019

Оптика Circe не предоставляет функции рекурсивной модификации из коробки.Однако вы можете сделать одно:

import io.circe.optics.JsonPath._

val modifyModel: Json => Json = root.model.string.modify("AAAA-" + _)

def modifyAllModels(value: Json): Json =
    root.each.json.modify(modifyAllModels)(modifyModel(value))

Модификация будет применена ко всем ключам, а не только к test - если вы этого не хотите, поменяйте each на test на modifyAllModels.

...