Как пройти список объектов с несколькими полями с помощью Circe Optics

Я ищу самый элегантный способ пройти по списку объектов с несколькими полями в Json с помощью Circe optics.

Допустим, у нас есть такой JSON:

[
  {
    "key1": "one",
    "key2": "two"
  },
  {
    "key1": "three",
    "key2": "four"
  }
]

и у нас есть класс случая case class Entity(key1: String, key2: String)

Поэтому я хочу найти самый элегантный и изящный способ пройти этот JSON и в конце создать список объектов case.

Я знаю, что могу использовать каждый: root.each.key1.string.getAll(json), но как мне создать линзу, которая даст мне проходимый кортеж (?) или что-то, что я мог бы вставить для понимания. Я, наверное, смогу как-нибудь комбинировать линзы.

Уже есть такой вопрос ( как разобрать un Array объекта с помощью Circe), но он имеет только одно поле в каждом объекте.

1 ответ

Недавно я также пытался решить очень похожую проблему: я хотел реализовать с помощью circe-json что было бы эквивалентом следующего jq линия:

      cat json | jq '.[] | {key1: .key1, key2: .key2}'

Самое близкое, что я получил, было это:

      import io.circe.optics.JsonPath.root

root.each.json.getAll(json)
  .map(j => (root.key1.string.getOption(j).get, root.key2.string.getOption(j).get))
  .map(Entity.apply)
Другие вопросы по тегам