使用 Circe 光学修改对象的所有字段或数组的所有项目

Using Circe optics to modify all fields of an object, or all items of an array

我正在尝试使用 Circe's optics 修改嵌套的 JSON 结构。但是,所有示例仅修改具有已知名称的对象中的单个字段。

我需要做的事情:

示例:

{
  "foo": [
    {
      "counter": 1
    },
    {
      "counter": 2
    }
  ],
  "bar": {
    "three": {
      "counter": 3
    },
    "four": {
      "counter": 4
    }
  }
}

应该变成

{
  "foo": [
    {
      "counter": 2
    },
    {
      "counter": 3
    }
  ],
  "bar": {
    "three": {
      "counter": 4
    },
    "four": {
      "counter": 5
    }
  }
}

当对象类型及其成员不是我期望的类型时的行为并不重要。

我期待这样的事情:

val incrementCounterArray: Json => Json =
    root.foo.eachArrayItem.counter.modify(_ + 1)
val incrementCounterObject: Json => Json =
    root.bar.eachObjectValue.counter.modify(_ + 1)

但我在教程中没有看到 eachArrayItemeachObjectValue 的任何定义。

正确的语法是

val incrementCounterArray: Json => Json =
  root.foo.each.counter.int.modify(_ + 1)

val incrementCounterObject: Json => Json =
  root.bar.each.counter.int.modify(_ + 1)

查看官方circe-optics documentation中的示例了解更多详情: