【问题标题】:Update json attribute with a condition in jolt使用 jolt 条件更新 json 属性
【发布时间】:2021-06-15 13:22:28
【问题描述】:

我有一个问题,我不明白如何在 jolt 中使用条件更新属性。例如,我有一个带有内部项目数组的对象。如果另一个 Item 属性等于某个值,我需要更新一个 Item 属性并返回 Object。

输入:

{
  "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",
                  "$1": "&3"
                }
              }
            }
          }
        }
      }
    }
  }
]

【问题讨论】:

    标签: json jolt


    【解决方案1】:

    您可以使用两步 shift 转换。

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

    [
      {
        "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].&"
            }
          }
        }
      }
    ]
    

    编辑:如果除了当前属性之外还有更多属性(id,del_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].&"
            }
          }
        }
      }
    ]
    

    【讨论】:

    • 谢谢!有用。但是items 中的属性似乎是硬编码的。如何更改请求以避免它?这样当我们更改 json 规范时(在items 中添加新参数)就不需要重做 jolt 请求。
    • 嗨@MorkovkA,不客气。条件的主要思想取决于问题中提出的需求,例如 if another Item attribute equals to something 。例如。选择的单个值(111)和其余的(*)通过这个想法来区分。你还有什么意思要避免我在这里看不到的硬编码。
    • 我的意思是,如果我们向items 添加一个新属性name。所以我们将在items 中有3 个属性:iddel_signname。甚至更多新的。
    • 是的,你是对的@MorkovkA。我已经添加了相关选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    相关资源
    最近更新 更多