Как разобрать вложенные массивы Json с помощью Circe Optics - PullRequest
2 голосов
/ 05 мая 2019

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

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

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

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

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

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

1 Ответ

5 голосов
/ 05 мая 2019

Если вам нужен причудливый стиль 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":["___"]}]]

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

...