json 如何在Apache NiFi中实现JoltTransforms中的if-else条件?

pgky5nke  于 2023-06-25  发布在  Apache
关注(0)|答案(1)|浏览(144)

我正在准备jolt规范,其中我需要实现if-else条件,但我无法实现它。请帮帮我
注意事项:
1.如果application-component-node对象正在输入,则打印该对象并删除application-componentapplication(如果所有三个应用程序对象都在输入)。
1.如果application-component对象正在输入,则打印该对象并丢弃application对象(如果所有两个应用程序对象数组都要输入)。
1.如果application对象只出现在输入中,则打印它。
例如:

[
  {
    "severity": "ERROR",
    "type": "POLICY_CONTINUES_CRITICAL",
    "affectedEntities": [
      {
        "entityType": "POLICY",
        "name": "Exception Per Minute",
        "entityId": 3683
      },
      {
        "entityType": "APPLICATION",
        "name": "Teashop",
        "entityId": 6026
      },
      {
        "entityType": "APPLICATION-Component",
        "name": "Teashop",
        "entityId": 602667
      }
    ],
    "subType": "OVERALL_APPLICATION",
    "id": 92876278,
    "triggeredEntity": null
  }
]

预期输出:

[
  {
    "severity": "ERROR",
    "type": "POLICY_CONTINUES_CRITICAL",
    "affectedEntities": [
      {
        "entityType": "APPLICATION-Component",
        "name": "Teashop",
        "entityId": 602667
      }
    ],
    "subType": "OVERALL_APPLICATION",
    "id": 92876278,
    "triggeredEntity": null
  }
]

这里的预期输出是application-component-node,并删除其他两个应用程序对象数组
三个对象数组之间的优先级如下:

  • 优先级1用于application-component-node
  • 优先级2用于application-component
  • 优先级3用于application

注意:三个对象数组是动态的,它们可能会出现,有时只有两个对象数组出现,有时只有一个对象数组出现。

qxgroojn

qxgroojn1#

您可以在modify规范中使用lastElement函数,例如

[
  {
    "operation": "sort"
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "others.&",
        "app*": {
          "@": "app[].&"
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "app": "=lastElement(@(1,&))"
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "[0].&"
      }
    }
  }
]

编辑:您也可以根据上次编辑的修改等级库中的firstElement函数使用以下转换:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "&",
        "aff*": {
          "*": {
            "*": "&2.@(1,entityType).&" // reconstruct subobjects with entityType keys
          }
        }
      }
    }
  },
  { // used for sorting purposes
    "operation": "shift",
    "spec": {
      "*": "&",
      "affectedEntities": {
        "APPLICATION-Component-Node": "&1[]",
        "APPLICATION-Component": "&1[]",
        "APPLICATION": "&1[]",
        "POLICY": "&1[]"
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "aff*": "=firstElement(@(1,&))"
    }
  }
]

其中entityTypes的大小写敏感性很重要。最后一个shift转换中的列表用于按给定的实体类型排序,就像在它们呈现的字母大小写中一样。
网站http://jolt-demo.appspot.com/上的*demo为:

相关问题