使用 jolt 中的条件更新 json 属性

Update json attribute with a condition in jolt

我有一个问题,我不明白如何更新带有 jolt 条件的属性。例如,我有一个带有内部项目数组的对象。如果另一个 Item 属性等于某物并且 return 对象,我需要更新 Item 属性。

输入:

{
  "object": {
    "id": "3cf1543e-be4d-11eb-84c0-87ba01ce01e0",
    "a": "abc",
    "del_sign": false,
    "items": [
      {
        "id": "111",
        "del_sign": false
      },
      {
        "id": "222",
        "del_sign": false
      },
      {
        "id": "333",
        "del_sign": false
      }
    ],
    "b": [],
    "c": []
  }
}

我需要:

{
  "object": {
    "id": "3cf1543e-be4d-11eb-84c0-87ba01ce01e0",
    "a": "abc",
    "del_sign": false,
    "items": [
      {
        "id": "111",

        // here changes to true
        "del_sign": true
      },
      {
        "id": "222",
        "del_sign": false
      },
      {
        "id": "333",
        "del_sign": false
      }
    ],
    "b": [],
    "c": []
  }
}

我目前的颠簸规格:

[
  {
    "operation": "shift",
    "spec": {
      "object": {
        "items": {
          "*": {
            "id": {
              "111": {
                "@2": {
                  "#true": "del_sign",
                  "": "&3"
                }
              }
            }
          }
        }
      }
    }
  }
]

您可以使用两步 shift 转换。

确定条件中的相关 del_sign 值,因为在同一对象 (items) 中有两个数组 iddel_sign,并在其中正确格式化它们第二步如

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "&",
        "items": {
          "*": {
            "id": {
              "111": {
                "@(2,&1)": "&4.&3.id",
                "#true": "&4.&3.del_sign"
              },
              "*": {
                "@1": "&4.&3.&2",
                "@(2,del_sign)": "&4.&3.del_sign"
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": "&",
      "items": {
        "*": {
          "*": "&2.[#2].&"
        }
      }
    }
  }
]

编辑:如果除了当前属性(iddel_sign)之外还有更多属性,那么最好使用以下代码,以免单独重复每个键,例如

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "&",
        "items": {
          "*": {
            "id": {
              "111": {
                "@2": {
                  "#true": "&5.&2.del_sign",
                  "*": "&5.&1.&"
                }
              },
              "*": {
                "@2": "&4.&3"
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "cardinality",
    "spec": {
      "items": {
        "*": {
          "del_sign": "ONE"
        }
      }
    }
   },
  {
    "operation": "shift",
    "spec": {
      "*": "&",
      "items": {
        "*": {
          "*": "&2.[#2].&"
        }
      }
    }
  }
]