Рекурсивный траверс JSON с цирковой оптикой - PullRequest
4 голосов
/ 26 марта 2019

У меня есть json со сложной структурой. Как то так:

{
  "a":"aa",
  "b":"bb",
  "c":[
    "aaa",
    "bbb"
  ],
  "d":{
    "e":"ee",
    "f":"ff"
  }
}

И я хочу прописать все строковые значения в верхнем регистре. Документация гласит:

root.each.string.modify(_.toUpperCase)

Но только корневые значения обновляются, как и ожидалось.

Как заставить circe-optics рекурсивно обойти все строковые значения?
JSON структура заранее неизвестна.

Вот пример на Scastie.


через комментарии: Я ожидаю, что все строковые значения в верхнем регистре, а не только корневые значения:

{
  "a":"AA",
  "b":"BB",
  "c":[
    "AAA",
    "BBB"
  ],
  "d":{
    "e":"EE",
    "f":"FF"
  }
}

1 Ответ

0 голосов
/ 17 июня 2019

Вот частичное решение, так как оно не полностью рекурсивное, но оно решит проблему с json из вашего примера:


val level1UpperCase = root.each.string.modify(s => s.toUpperCase)

val level2UpperCase = root.each.each.string.modify(s => s.toUpperCase)
val uppered = (level1UpperCase andThen level2UpperCase)(json.right.get)

...