使用 Circe 光学修改对象的所有字段或数组的所有项目
Using Circe optics to modify all fields of an object, or all items of an array
我正在尝试使用 Circe's optics 修改嵌套的 JSON 结构。但是,所有示例仅修改具有已知名称的对象中的单个字段。
我需要做的事情:
- 假设我的对象的
foo
键包含一个对象数组,在每个对象中递增 counter
键。
- 假设我的对象的
bar
键包含一个对象,在映射到该对象中每个键的值中递增 counter
键。
- 保持对象中的所有其他值不变。
示例:
{
"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)
但我在教程中没有看到 eachArrayItem
或 eachObjectValue
的任何定义。
正确的语法是
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中的示例了解更多详情:
我正在尝试使用 Circe's optics 修改嵌套的 JSON 结构。但是,所有示例仅修改具有已知名称的对象中的单个字段。
我需要做的事情:
- 假设我的对象的
foo
键包含一个对象数组,在每个对象中递增counter
键。 - 假设我的对象的
bar
键包含一个对象,在映射到该对象中每个键的值中递增counter
键。 - 保持对象中的所有其他值不变。
示例:
{
"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)
但我在教程中没有看到 eachArrayItem
或 eachObjectValue
的任何定义。
正确的语法是
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中的示例了解更多详情: