Как анализировать вложенные массивы Json с помощью Circe Optics

Я прочитал пример, приведенный в документации Circe, с использованием Circe Optics. Пример в документации довольно прост, потому что путь к узлу довольно легко найти.

В моем случае json выглядит как

import io.circe._, io.circe.parser._

val json = """[["a",{"entity":["foo"]}],["b",{"entity":["bar"]}]]"""

Это действительный json, и я могу разобрать, используя parse(json)

Но как мне написать линзу, чтобы я извлекал все "foo", "bar".


person Knows Not Much    schedule 05.05.2019    source источник


Ответы (1)


Если вам нужен причудливый стиль JsonPath, вы можете использовать each для выбора каждого совпадающего элемента массива JSON, чтобы ваш путь мог выглядеть следующим образом:

import io.circe.optics.JsonPath

val entities = JsonPath.root.each.each.entity.each.string

А затем предположим, что у вас есть следующее значение Json:

import io.circe.jawn.parse

val Right(json) = parse("""[["a",{"entity":["foo"]}],["b",{"entity":["bar"]}]]""")

Вы можете использовать путь Traversal следующим образом:

scala> entities.getAll(json)
res0: List[String] = List(foo, bar)

scala> entities.modify(_ * 2)(json).noSpaces
res1: String = [["a",{"entity":["foofoo"]}],["b",{"entity":["barbar"]}]]

scala> entities.set("___")(json).noSpaces
res2: String = [["a",{"entity":["___"]}],["b",{"entity":["___"]}]]

Вы также можете создать путь явно, но для этого потребуется гораздо больше кода.

person Travis Brown    schedule 05.05.2019